[C++] Fehlerhaftes Laden von Texturen mit DX9

WhiteGandalf

Mitglied
Benutze: WinXP, Visula Studio 6, Dx 9.0c

Hi,

ich habe folgendes Problem: Ich initialisiere 4 Vektoren und "spanne" eine vorher mit 'D3DXCreateTextureFromFileEx' geladene Textur darüber. Das funktioniert soweit auch, nur wird die Textur leider immer fehlerhaft geladen, d.h. einige Pixel, die in der Textur schwarz sind, sind beim Render auf einmal blau. Die Textur ist 8x8 Texel groß, komplett schwarz bis auf eine blaue Linie, die von der oberen rechten Ecke zur unteren, linken geht. Und beim Render ist auf einmal auch die untere, rechte Ecke blau, obwohl sie in der Textur schwarz ist! Habs sowohl mit .bmp als auch mit .jpg probiert, aber es ist beide Male das gleiche.
Hat jemand ne Idee woran das liegen könnte? Thx im Vorraus

Edit: Hab jetzt ne Bmp angehängt um das zu verdeutlichen
 

Anhänge

Zuletzt bearbeitet:
Wie berechnest du die Textur-Koordinaten?

Prüfst du die Grösse der Textur, die D3DXCreateTextureFromFileEx erzeugt? Du kannst nämlich nicht davon ausgehen, dass die Funktion die Textur in der gleichen Grösse wie die Grafik erzeugt. Die Funktion passt die Grösse den Fähigkeiten der Grafikkarte an (es gibt Minimal-,Maximal- und Quadrat-Zwang-Fähigkeiten).

Bei der Berechnung von den Textur-Koordinaten musst du deshalb immer von der tatsächlichen Grösse der Textur ausgehen, nicht von der Grösse der Originalgrafik.
 
Nein, ich prüfe die Größe nicht (wüsste jetzt auch gar nicht wie das geht ;) ), aber da die Textur 8x8 Pixel groß ist (2-er Potenz) müsste sie auch im Speicher 8x8 Pixel groß sein.

EDIT: Hab noch ein bisschen rumprobiert und dabei gemerkt: Wenn ich die Textur nicht auf ein 8x8 Quadrat lege sondern auf eines mit der Größe 64x64 oder größer, ist der Fehler verschwunden!! Wie kann das sein?
 
Zuletzt bearbeitet:
Genau das meine ich, ich vermute, dass du eine grössere Textur bekommst als 8x8. Das ist nämlich recht klein.

Mit dem Code-Schnipsel bekommst du die Grösse raus:

D3DSURFACE_DESC ddsd;
pSurface->GetLevelDesc( 0, &ddsd );

Zeig auf jeden Mal sicherheitshalber, wie du die Textur-Koordinaten berechnest. Im Grunde müsste das so aussehen:

Vertex links oben TU = 0.0f / ddsd.Width; TV = 0.0f / ddsd.Height;
Vertex rechts oben TU = 8.0f / ddsd.Width; TV = 0.0f / ddsd.Height;
Vertex links unten TU = 0.0f / ddsd.Width; TV = 8.0f / ddsd.Height;
Vertex rechts unten TU = 8.0f / ddsd.Width; TV = 8.0f / ddsd.Height;

Evtl. die Anpassung um 0.5f für genaue Pixel mit einrechnen.
 
Nein, die Textur ist 8x8 groß. Ich setzte die Werte so:
//Svertex2D ist die von mir definierte Vertexstruktur

SVertex2D m_v[4];

//...andere Initialisierungen (Farbe, RHW...) lass ich jetzt weg, geb nur Pos und Tex-//Koords an
//float fx, fy werden der Init-Funktion übergeben, geben die Position an, tbVector3 ist der
//3D-Vektor der Engine die ich benutze

m_v[0].vPos = tbVector3(fx, fy, 0.0f);
m_v[1].vPos = tbVector3(fx+8, fy, 0.0f);
m_v[2].vPos = tbVector3(fx, fy+8, 0.0f);
m_v[3].vPos = tbVector3(fx+8, fy+8, 0.0f);
m_v[0].vTex1.u = 0.0f;
m_v[0].vTex1.v = 0.0f;
m_v[1].vTex1.u = 1.0f;
m_v[1].vTex1.v = 0.0f;
m_v[2].vTex1.u = 0.0f;
m_v[2].vTex1.v = 1.0f;
m_v[3].vTex1.u = 1.0f;
m_v[3].vTex1.v = 1.0f;

//So mach ich es immer wenn die komplette Textur gerendert werden soll, hat bisher
//auch immer geklappt
 
Dann könnte es evtl. sein, dass der linke Rand der Texture von rechts reinblendet. Versuch mal testweise entweder das bilineare Filtering abzustellen oder die Texturkoordinated ein Pixel in die Textur reinzuverschieben.

Das sah in deiner Beispiel-BMP zwar etwas grösser aus als nur ein Pixel aber das fällt mir da noch ein.
 
Jawoll, ich habs hinbekommen ^^
Hab einfach die Texturgröße von 8x8 auf 64x64 gesetzt, jetzt geht es (warum auch immer :confused: )

Vielen Dank das du dir so viel Mühe gegeben hast mir zu helfen, Endurion :)
 
Zurück