[C++] [D3D9] Texturkoordinaten und Skalierung
Verfasst: 27.02.2018, 21:11
Hallo.
In bestimmten Zoom/Skalierungsleveln zeigt meine Engine "Renderfehler": Das Direct3DDevice9 wird so auf das 2D-Rendern vorbereitet:
Die Texturkoordinaten werden aufgrund der Gesamtgröße der Textur und dem zu rendernden Bereich/Bild erzeugt:
Die 2D-Zielkoordinaten werden um 0.5 reduziert, also X1, Y1, X2 und Y2 -= 0.5f.
Ein Beispiel: Erste Zeile ist ZielXY (-0.5f fehlt noch), zweite Zeile das Rect vom Bild auf der Textur und die dritte Zeile das TextureRect.
Die Renderfehler treten immer nur dann auf, wenn ZielXY Nachkommastellen hat. (vor dem -0.5f)
Selbst wenn ich aber alle Zielkoordinaten vor der 0.5f-Subtraktion runde, bekomme ich "Lücken": Ich habe bis jetzt zwei Lösungen gefunden, um diese Renderfehler zu vermeiden, bzw. sie "unsichtbar" zu machen.
1. Jedes Bild/Image/Tile hat in der Textur einen ein Pixel breiten transparenten Rahmen.
2. Ich addiere zu den Texturkoordinaten 0.001f hinzu.
Mein Frage dazu:
Ist mein Problem ein allgemeines Problem und man muss eine "Notlösung/Fix" implementieren, oder mache ich vermutlich irgendwas grundlegend falsch?
In bestimmten Zoom/Skalierungsleveln zeigt meine Engine "Renderfehler": Das Direct3DDevice9 wird so auf das 2D-Rendern vorbereitet:
Code: Alles auswählen
const UInt32 D3DFVF_CUSTOM_2D = Direct3D9::D3DFVF_XYZRHW | Direct3D9::D3DFVF_DIFFUSE | Direct3D9::D3DFVF_TEX1;
m_Direct3DDevice9->SetFVF(D3DFVF_CUSTOM_2D);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_COLORWRITEENABLE, 0x0000000F);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_LIGHTING, False);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_ALPHABLENDENABLE, True);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_CULLMODE, Direct3D9::D3DCULL_NONE);
m_Direct3DDevice9->SetTextureStageState(0, Direct3D9::D3DTSS_ALPHAOP, Direct3D9::D3DTOP_MODULATE);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_ZENABLE, False);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_ZWRITEENABLE, False);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_ALPHATESTENABLE, False);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_FILLMODE, Direct3D9::D3DFILL_SOLID);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_SRCBLEND, Direct3D9::D3DBLEND_SRCALPHA);
m_Direct3DDevice9->SetRenderState(Direct3D9::D3DRS_DESTBLEND, Direct3D9::D3DBLEND_INVSRCALPHA);
Code: Alles auswählen
TextureRect.X1 = ImageRect.X1 / TextureWidth;
TextureRect.Y1 = ImageRect.Y1 / TextureHeight;
TextureRect.X2 = ImageRect.X2 / TextureWidth;
TextureRect.Y2 = ImageRect.Y2 / TextureHeight;
Ein Beispiel: Erste Zeile ist ZielXY (-0.5f fehlt noch), zweite Zeile das Rect vom Bild auf der Textur und die dritte Zeile das TextureRect.
Die Renderfehler treten immer nur dann auf, wenn ZielXY Nachkommastellen hat. (vor dem -0.5f)
Selbst wenn ich aber alle Zielkoordinaten vor der 0.5f-Subtraktion runde, bekomme ich "Lücken": Ich habe bis jetzt zwei Lösungen gefunden, um diese Renderfehler zu vermeiden, bzw. sie "unsichtbar" zu machen.
1. Jedes Bild/Image/Tile hat in der Textur einen ein Pixel breiten transparenten Rahmen.
2. Ich addiere zu den Texturkoordinaten 0.001f hinzu.
Mein Frage dazu:
Ist mein Problem ein allgemeines Problem und man muss eine "Notlösung/Fix" implementieren, oder mache ich vermutlich irgendwas grundlegend falsch?