» »

[DirectX] Problem s teksturami

[DirectX] Problem s teksturami

Klobasa ::

LP!

Nekaj časa že delam na dx gui knjižnici kateri bi rad dodal funkcionalnost uvoza in uporabo slikovnih datotek. Do sedaj sem za prikaz panelov, frejmov, gumbov... uporabljal funkcije kot so drawline, drawrect, fillrgb..., sedaj pa bi rad v knjižnico dodal zaobljene AA robove in stuff.

Pa kar direkt k problemu:

konstruktor texture
Texture::Texture(IDirect3DDevice9* device, const char* srcfile)
{
    D3DXCreateSprite( device, &m_sprite );

	D3DXCreateTextureFromFileExA( device,           // pDevice
                                  srcfile,          // pSrcFile
								  D3DX_DEFAULT,     // Width
								  D3DX_DEFAULT,     // Height
								  D3DX_DEFAULT,     // MipLevels
								  D3DUSAGE_DYNAMIC, // Usage
								  D3DFMT_FROM_FILE, // Format
								  D3DPOOL_DEFAULT,  // Pool
								  D3DX_DEFAULT,     // Filter
								  D3DX_DEFAULT,     // MipFilter
								  0xff00ffff,       // ColorKey
								  NULL,             // pSrcInfo
								  NULL,             // pPalette
								  &m_texture        // ppTexture
								  );

    assert( m_texture );

	m_texture->GetLevelDesc( 0, &m_desc );
}


paint teksture
void Texture::Paint(float x, float y, float w, float h)
{
	D3DXVECTOR2 translation = D3DXVECTOR2( x , y );

	D3DXVECTOR2 scaling( ( 1.f / m_desc.Width ) * w, ( 1.f / m_desc.Height ) * h );

	D3DXMATRIX matrix;
	D3DXMatrixTransformation2D( &matrix, 0, 0, &scaling, 0, 0, &translation );

	m_sprite->SetTransform( &matrix );

	m_sprite->Begin( D3DXSPRITE_ALPHABLEND );
	m_sprite->Draw( m_texture, 0, 0, 0, 0xFFFFFFFF );
	m_sprite->End();
}



to je ss konvertane dds datoteke, ki jo uporabljam za titlebar v settings panelu za counter strike source game hack

 pgui_titlebar.dds

pgui_titlebar.dds




in tu je bugast rezultat:

 pgui_css

pgui_css




Zakaj za boga se mi v levem in desnem zgornjem vogalu delata črti?

Senitel ::

Vklopljen imaš anti aliasing, linearen filtering in wrap addressing po U in V. Am I right?
Tako da na zgornjem delu vidiš en konček spodnjega.
Zdej ali prisiliš x in y, da padeta točno na pixel center (0.5, 0.5 in ne 0.0, 0.0), ali v pixel shaderju uporabiš centroid sampling ali pa nastaviš D3DSAMP_ADDRESSV na D3DTADDRESS_CLAMP za ta sampler.

Zgodovina sprememb…

  • spremenil: Senitel ()

Klobasa ::

Uh, hvala za tako hiter odgovor. Bom še vidu kaj bom skupaj zlimal, važn, da si mi dal vedeti, kje bi znal biti problem. Če bom še kaj rabil, se javim.

Hvala

Klobasa ::

Evo našel rešitev. Glede na to, da mi od zgoraj naštetih predlogov nič ni pomagalo, sem se še 1x vrgel na konstruktor teksture.
Težavo sem odpravil na sledeč način:
Texture::Texture(const char* srcfile)
{
    IDirect3DDevice9* device = g_pPGuiSurface->GetDevice();

    D3DXCreateSprite( device, &m_sprite );

    D3DXIMAGE_INFO image;
    D3DXGetImageInfoFromFile( srcfile, &image );
    
	D3DXCreateTextureFromFileExA( device,
                                  srcfile,
                                  image.Width,
                                  image.Height,
								  image.MipLevels,
								  D3DUSAGE_DYNAMIC,
                                  image.Format,
								  D3DPOOL_DEFAULT,
								  D3DX_DEFAULT,
								  D3DX_DEFAULT,
								  0,
								  NULL,
								  NULL,
								  &m_texture
								  );

    assert( m_texture );

	m_texture->GetLevelDesc( 0, &m_desc );
}

Senitel ::

Doh... >:D Zdele vidim ja... Tvoja tekstura ni "power of 2" dimenzij in D3DXCreateTextureFromFileExA z D3DX_DEFAULT dimenzijami ti jo raztegne na 1024x32 in potem še mip mape zgradi nazaj dol. Ti pa potem dobiš downsample iz 1024x32 nazaj na 600x20. Sedaj ker imaš direkt non power of two teksturo (in ti hardware to podpira) v tem primeru sploh nimaš filteringa, ker je 1:1 iz teksture na screen.

Sedajle gledam dokumentacijo in m_sprite->Begin že sam nastavi ustrezno samplerje... Posiliš kakšen anisotropic filtering iz driverjev?

Klobasa ::

Hvala za ves info, mi je tole "power of 2" pravilo, raztegovanje in krcenje slike dalo malo misliti.

Ni mo ravno jasno kaj si mislil s posiljevanjem AF iz driverjev???

Senitel ::

Grafičen driver lahko "posili" aplikacijo z določenimi nastavitvami. Recimo aplikacija želi linearen filtering, driver ignorira in dela AF (isto AA). To tudi lahko povzroči kaj nepričakovanega.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

DirectX - težavica

Oddelek: Programiranje
141242 (975) Senitel
»

No sound (Wolfenstein...)

Oddelek: Igre
152078 (1914) Slo-One
»

voodoo3 in dx8, premalo video memory

Oddelek: Pomoč in nasveti
121064 (916) KontraCepec
»

DirectX, neki ne gre

Oddelek: Programiranje
61134 (1032) Senitel

Več podobnih tem