Was ist die beste übung zum Rendern von sprites in DirectX 11?
Ich bin derzeit versuchen zu bekommen verwendet, um die DirectX-API und ich Frage mich, was ist die übliche Vorgehensweise, um ein sprite Rendern in DirectX-11 - (z.B. für einen tetris-Klon).
Ist es ein anderes interface als ID3DX10Sprite
, und wenn nicht, welche wäre die übliche Methode zum zeichnen von sprites in DirectX 11?
Edit: Hier ist die HLSL-code, der für mich gearbeitet (die Berechnung der Projektions-Koordinate könnte besser gemacht werden):
struct SpriteData
{
float2 position;
float2 size;
float4 color;
};
struct VSOut
{
float4 position : SV_POSITION;
float4 color : COLOR;
};
cbuffer ScreenSize : register(b0)
{
float2 screenSize;
float2 padding; //cbuffer must have at least 16 bytes
}
StructuredBuffer<SpriteData> spriteData : register(t0);
float2 GetVertexPosition(uint VID)
{
[branch] switch(VID)
{
case 0:
return float2(0, 0);
case 1:
return float2(1, 0);
case 2:
return float2(0, 1);
default:
return float2(1, 1);
}
}
float4 ComputePosition(float2 positionInScreenSpace, float2 size, float2 vertexPosition)
{
float2 origin = float2(-1, 1);
float2 vertexPositionInScreenSpace = positionInScreenSpace + (size * vertexPosition);
return float4(origin.x + (vertexPositionInScreenSpace.x /(screenSize.x /2)), origin.y - (vertexPositionInScreenSpace.y /(screenSize.y /2)), 1, 1);
}
VSOut VShader(uint VID : SV_VertexID, uint SIID : SV_InstanceID)
{
VSOut output;
output.color = spriteData[SIID].color;
output.position = ComputePosition(spriteData[SIID].position, spriteData[SIID].size, GetVertexPosition(VID));
return output;
}
float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
return color;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es ist nicht ein äquivalent. Übliche Methode wäre, um ein Dreieck zeichnen Streifen bilden einen quad.
Könnten Sie machen Gebrauch von instancing, so dass Sie nur zur Aktualisierung eines Puffers mit sprite-Daten (x -, y-position auf dem Bildschirm in Pixel, id der textur zu Holen, in ein texture-array, Skalierung, rotation, Ebene, etc) und die Nutzung der Shader für das rendering alle sprites in einem einzigen draw call.
Hier einige HLSL Leckerbissen aus der Spitze von meinem Kopf: