顶点组合HLSL的着色器侧

时间:2011-04-03 03:11:48

标签: directx semantics shader hlsl

假设你要求directX从多个顶点缓冲区发送顶点数据,如下所示:

immediateContext->IASetVertexBuffers( 0, 3, bufferArray, &vertexStride, 0 );
immediateContext->IASetIndexBuffer( indexBuffer, DXGI_FORMAT_R32_UINT, 0 );
immediateContext->DrawIndexed( numIndices, 0 , 0 );

现在HLSL方面应该做这样的事情:

struct FatVertex
{
    float4 dataFromVertexBuffer1: SemanticName1
    float4 dataFromVertexBuffer2: SemanticName2
    float4 dataFromVertexBuffer3: SemanticName3
};

PixelShaderInput VertexShader( FatVertex input )
{
    // Transform things, fill PixelShaderInput struct etc.
}

或类似的东西:

struct BufferData1
{
    float4 dataFromVertexBuffer1: SemanticName1
};

struct BufferData2
{
    float4 dataFromVertexBuffer2: SemanticName2
};

struct BufferData3
{
    float4 dataFromVertexBuffer3: SemanticName3
};

PixelShaderInput VertexShader( BufferData1 input1, BufferData2 input2, BufferData3 input3 )
{
    // Transform things, fill PixelShaderInput struct etc.
}

或两者都完全有效(因为我假设语义名称告诉Direct3D把东西放在哪里)。

这都是Direct3D11。

1 个答案:

答案 0 :(得分:0)

两种方式都是合法的,HLSL确实使用了语义索引。这样可以提供很大的灵活性,对于习惯使用GLSL的人来说非常棒。