D3D11-将混合权重和索引传递到顶点着色器

时间:2018-10-27 22:11:36

标签: c++ directx-11 hlsl vertex-shader

我试图将混合权重和索引作为float4s传递给我的顶点着色器;在C ++中,保存每个顶点数据的结构如下:

struct VertexType_Skin {
    XMFLOAT3 position;
    XMFLOAT2 texture;
    XMFLOAT3 normal;
    XMFLOAT4 boneIds;
    XMFLOAT4 boneWeights;
};

并在HLSL顶点着色器中:

struct VS_IN {
    float3 position : POSITION;
    float2 tex : TEXCOORD0;
    float3 normal : NORMAL;
    float4 boneIds : BLENDINDICES;
    float4 boneWeights : BLENDWEIGHT;
};

我正在C ++中设置顶点缓冲区:

D3D11_BUFFER_DESC vertexBufferDesc = { sizeof(VertexType_Skin) * vertexCount, D3D11_USAGE_DEFAULT, D3D11_BIND_VERTEX_BUFFER, 0, 0, 0 };
vertexData = { skinVertices, 0 , 0 };
device->CreateBuffer(&vertexBufferDesc, &vertexData, &vertexBuffer);

现在我不确定为什么,但是这样做似乎根本无法渲染我的网格物体。注释掉两个结构中的float4都可以正常工作(我还没有使用id或权重,只是试图通过它们)。

此设置中是否缺少任何明显的东西?

谢谢!

1 个答案:

答案 0 :(得分:0)

没关系,我知道了。我不知道这是否能帮助任何人,因为这是一个奇怪的特定问题,但是无论如何,这还是可以的。

我正在每帧发送这样的网格数据(因为它在基类中):

unsigned int stride = sizeof(VertexType);//<-- this struct only contains position, uvs and normals
unsigned int offset = 0;

deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
deviceContext->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0);
deviceContext->IASetPrimitiveTopology(top);

因此,这样做可以解决问题:

unsigned int stride = sizeof(VertexType_Skin);//<-- the updated struct with bone indices and weights
unsigned int offset = 0;

deviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
deviceContext->IASetIndexBuffer(indexBuffer, DXGI_FORMAT_R32_UINT, 0);
deviceContext->IASetPrimitiveTopology(top);

Ta-dah,像馅饼一样容易!干杯:)