Sehr langsame direkte 3D-Texturabtastung

9

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.

dotminic
quelle
Welche Hardware hast du? Vier Texturbeispiele sollten auf keiner neuen Hardware ein Problem darstellen.
Axel Gneiting
Ich habe eine Radeon X1950, ja, sie ist ein paar Jahre alt, wenn nicht mehr. Ich vermute, es ist vielleicht nicht die beste Hardware. Was denken Sie ?
Dotminic

Antworten:

9

Wenn Sie die Dinge beschleunigen möchten, können Sie einen sogenannten Texturatlas verwenden.

Wikipedia - Ein Texturatlas ist ein großes Bild oder "Atlas", der viele kleinere Teilbilder enthält, von denen jedes eine Textur für einen Teil eines 3D-Objekts ist. Die Untertexturen können gerendert werden, indem die Texturkoordinaten der uvmap des Objekts auf dem Atlas geändert werden, um im Wesentlichen anzugeben, in welchem ​​Teil des Bildes sich die Textur befindet. In einer Anwendung, in der häufig viele kleine Texturen verwendet werden, ist dies häufig effizienter Speichern Sie die Texturen in einem Texturatlas, der von der Grafikhardware als Einheit behandelt wird.

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.

Alt-Text

zfedoran
quelle
1
Vielen Dank für den Rat, ich habe meinen Shader mithilfe eines Texturatlas implementiert. Ich bekomme jetzt "nur" 109 fps, aber es ist eine nette Verbesserung gegenüber den 55 fps, die ich bekommen habe. Vielen Dank!
Dotminic
1
+1 für eine gute Antwort. Darf ich fragen, woher Sie dieses Texturatlasbild haben? Ist es proprietär oder für jede Verwendung kostenlos?
Cameron
4

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.

Bluescrn
quelle
Danke für den Rat, ich werde es das nächste Mal versuchen.
Dotminic
3

Haben Ihre Texturen Mipmaps?

Ohne Mipmapping kann das Textur-Sampling besonders teuer sein (viele Cache-Fehler)

Bluescrn
quelle
Ja, die Texturen haben Mipmaps. Ich habe sie als * .dds aus dem DirectX-Textur-Tool exportiert. Aber wie verwenden sie Texturen in kommerziellen Spielen, in denen es überall eine Menge hochauflösender Texturen gibt? Ich probiere nur 1 Texturatlas aus und erhalte eine Bildrate von 109 fps, während ich ein Terrain rendere, alles auf der GPU.
Dotminic