2010-10-07 25 views
9

Şu anda DirectX API'sine alışmaya çalışıyorum ve DirectX 11'de (örneğin bir tetris klonu için) bir hareketli grafiğin oluşturulması için olağan yaklaşımın ne olduğunu merak ediyorum.Spriteları DirectX 11'de işlemek için en iyi prati nedir?

ID3DX10Sprite olarak bir simmilar arabirim var mı ve yoksa, DirectX 11'de sprite çizmek için her zamanki yöntem hangisidir?

Düzenleme:

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; 
} 

cevap

6

Hayır eşdeğer yoktur: Burada benim için çalıştı HLSL kodu (projeksiyon hesaplama daha iyi yapılabilirdi koordinat) 'dir. Her zamanki yöntem, bir dörtgeni oluşturan bir üçgen şerit çizmek olacaktır.

Örneklemeden faydalanabilirsiniz, bu nedenle yalnızca bir sprite verisi olan arabelleği güncellemeniz gerekir (x, y piksel cinsinden ekran konumu, bir doku dizisi, ölçeklendirme, döndürme, katman, vb. Almak için dokunun kimliği) ve tüm sprite'ları tek bir çizim çağrısı için işleyen shader'ları kullanın.

İşte başımın üstü kapalı bazı HLSL çerez var:

//-------------------------------------------------------------------------------------- 
// Shader code for Sprite Rendering 
//-------------------------------------------------------------------------------------- 

struct Sprite { 
    float2 position; // x, y world position 
    float rotation; 
    float scaling; 

    float layer; // if you have multiple layers of sprites (e.g. background sprites) 
    uint textureId; 
}; 

StructuredBuffer<Sprite> SpritesRO : register(t0); 
Texture2DArray<float4> TextureSlices : register (t1); 

cbuffer cbRenderConstants : register(b0) 
{ 
    matrix g_mViewProjection; 
    // other constants 
}; 

struct VSSpriteOut 
{ 
    float3 position : SV_Position; 
    uint textureId; 
}; 

//-------------------------------------------------------------------------------------    
// Sprite Vertex Shader 
//------------------------------------------------------------------------------------- 

VSSpriteOut SpriteVS(uint VID : SV_VertexID, uint SIID : SV_InstanceID) 
{ 
    VSSpriteOut Out = (VSSpriteOut)0; 

    // VID is either 0, 1, 2 or 3 
    // We can map 0 to position (0,0), 1 to (0,1), 2 to (1,0), 3 to (1,1) 

    // We fetch the sprite instance data accord SIID 
    Sprite sdata = SpritesRO[SIID]; 

    // function f computes screen space vertex position 
    float3 pos = f (g_mViewProjection, VID, position, rotation, scaling, layer etc) 

    Out.position = pos; 
    Out.textureId = sdata.textureId; 

    return Out; 
} 

//------------------------------------------------------------------------------------- 
// Sprite Pixel Shader 
//------------------------------------------------------------------------------------- 

float4 SpritePS(VSSpriteOut In) : SV_Target 
{ 
    // use In.textureId to fetch the right texture slice in texture array 
    return color; 
} 
+0

Bana bir kısa kod örneği verebilir misiniz? Tamponla başlamak için uğraşıyorum. –

+0

DXSDK'nin tüm D3D11 örneklerine göz atın ve Tamponlar oluşturmak, bunları ciltlemek, güncellemek vb. Için dikkatlice bakın. – Stringer

+0

Vay, teşekkür ederim. Bu gerçekten başladım bana yardımcı oldu :) –

İlgili konular