Forum » Programiranje » [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
paint teksture
to je ss konvertane dds datoteke, ki jo uporabljam za titlebar v settings panelu za counter strike source game hack
in tu je bugast rezultat:
Zakaj za boga se mi v levem in desnem zgornjem vogalu delata črti?
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
in tu je bugast rezultat:
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.
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
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:
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... 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?
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???
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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | DirectX - težavicaOddelek: Programiranje | 1257 (990) | Senitel |
» | No sound (Wolfenstein...)Oddelek: Igre | 2090 (1926) | Slo-One |
» | voodoo3 in dx8, premalo video memoryOddelek: Pomoč in nasveti | 1072 (924) | KontraCepec |
» | DirectX, neki ne greOddelek: Programiranje | 1146 (1044) | Senitel |