Also schreibe ich ein kleines Spiel mit Direct3D 9 und verwende Multitexturing für das Gelände. Ich probiere nur 3 Texturen und eine Mischkarte aus und erhalte die Gesamtfarbe aus den drei Texturen basierend auf den Farbkanälen aus der Mischkarte. Wie auch immer, ich bekomme einen massiven Rückgang der Bildrate, wenn ich mehr als eine Textur abtaste. Ich gehe von 120+ fps auf knapp 50.
Dies ist der HLSL-Code, der für die Verlangsamung verantwortlich ist:
float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone = tex2D(StoneTex, multiTex).rgb;
float3 grass = tex2D(GrassTex, multiTex).rgb;
float3 blend = tex2D(BlendMapTex, blendMap).rgb;
Mache ich es falsch Wenn jemand irgendwelche Informationen oder Tipps über Textur-Sampling oder irgendetwas hat, wäre das schön.
Vielen Dank.
Antworten:
Wenn Sie die Dinge beschleunigen möchten, können Sie einen sogenannten Texturatlas verwenden.
Für eine GPU ist es effizienter, eine einzelne große Textur viermal abzutasten, während vier Bilder jeweils einmal abgetastet werden. Hier ist ein Beispiel eines Geländetexturatlas.
quelle
Eine andere zu berücksichtigende Sache ist das Texturformat. Ist es eine rohe 32bpp Textur? In diesem Fall sollten Sie eine komprimierte DXT1-Textur mit 4 Bit / Pixel (1/8 des Leerzeichens) oder DXT5 mit 8 Bit / Pixel verwenden, wenn Sie den Alphakanal benötigen.
Das Reduzieren der Größe der Texturdaten sollte zu reduzierten Anforderungen an die Bandbreite des Texturspeichers und zu einer verbesserten Leistung des Texturcaches führen.
Stellen Sie außerdem sicher, dass Sie keine anisotrope Filterung mit maximaler Qualität eingestellt haben - dies kann zu erheblichen Kosten führen.
quelle
Haben Ihre Texturen Mipmaps?
Ohne Mipmapping kann das Textur-Sampling besonders teuer sein (viele Cache-Fehler)
quelle