D3D11 - 将混合权重和索引传递给顶点着色器
D3D11 - passing blend weights and indices to 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);
现在我不确定为什么,但这样做似乎根本不会渲染我的网格。注释掉两个结构中的 float4s 效果很好(我还没有使用 ids 或权重,只是试图传递它们)。
我在此设置中是否明显遗漏了什么?
谢谢!
没关系,我想通了。我不知道这是否可以帮助任何人,因为这是一个奇怪的特定问题,但无论如何都可以。
我每帧都像这样发送网格数据(因为它在基础 class 中):
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,简单易行!干杯:)
我正在尝试将混合权重和索引作为 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);
现在我不确定为什么,但这样做似乎根本不会渲染我的网格。注释掉两个结构中的 float4s 效果很好(我还没有使用 ids 或权重,只是试图传递它们)。
我在此设置中是否明显遗漏了什么?
谢谢!
没关系,我想通了。我不知道这是否可以帮助任何人,因为这是一个奇怪的特定问题,但无论如何都可以。
我每帧都像这样发送网格数据(因为它在基础 class 中):
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,简单易行!干杯:)