Directx 顶点合成HLSL的着色器侧

Directx 顶点合成HLSL的着色器侧,directx,semantics,shader,hlsl,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 );

假设您要求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.
}
或者像这样:

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。

两种方法都是合法的,HLSL确实使用了语义索引。这允许很大的灵活性,对于习惯GLSL的人来说,这真是太棒了