Wie schon im Jammer-Thread angedeutet habe ich aktuell ein Problem mit vielen vielen kleinen Flächen, die ich effizient rendern möchte. NVidia NSight ist zwar nur ein unvollkommenes Werkzeug, aber der Grundaussage der Profiler-Läufe kann ich wohl trauen: die GPU verbringt drei Viertel der Zeit im Input Assembler. Was kann ich dagegen tun?
Ich dachte mir, das Verkleinern der Eingabestrukturen könnte helfen. Das habe ich wie folgt ausprobiert:
Code: Alles auswählen
struct VoxelVertex
{
float3 vpos;
ubyte4 vtex;
};
struct InstanzVertex
{
float3 ipos;
ubyte4 inorm;
ubyte4 igr_und_tex;
ubyte4 ifarbe;
};
VertexAusgabe main( const VertexEingabe rein)
{
// Ausgabestruktur
VertexAusgabe raus;
// Instanz in Kamerakoordinaten transformieren
float4 pos = float4( rein.ipos * gVoxelGroesse, 1.0f);
float3 norm = mul( (float3x3) gObjektMatrix, rein.inorm * (2.0f / 255.0f) - float3( 1.0f, 1.0f, 1.0f));
float4 weltPos = mul( gObjektMatrix, pos);
float4 kamPos = mul( gWeltMatrix, pos);
// dort zu Quadrat entfalten
float igr = rein.igr_und_tex.x * (1.0f / 255.0f) + rein.igr_und_tex.y;
kamPos.xyz += rein.vpos * gVoxelGroesse * igr;
// und ausgeben
raus.mPosition = mul( gProjMatrix, kamPos);
// Texturkoordinaten erstellen
float texgr = 32.0f / 2048.0f;
float2 texpos = (rein.igr_und_tex.zw * 40.0f + 4.0f) * (1.0f / 2048.0f);
raus.mTexKoords = texpos + rein.vtex * texgr;
return raus;
}
Eine Idee wäre noch, das Instancing sein zu lassen, und mit DX10 und einem GeometrieShader Point Sprites zu pinseln. Das würde evtl. den Input Assembler entlasten, weil der dann kein Instancing mehr zusammensuchen muss und der VertexShader nur noch pro Voxel einmal läuft. Dazu müsste ich aber auf DX10 wechseln, was ich bisher eigentlich nicht wollte.