我在Direct3D9中练习绘图,遇到了一个小问题。
例如,d3ddev->SetStreamSource(1, NULL, 0, sizeof(CUSTOMVERTEX));
中的第一个参数是指定“数据流”,但是我不知道那是什么。
我已经绘制出想要的形状,但是我仍然不明白“数据流”的含义。
最佳答案
以前,这就是所谓的“多流”顶点缓冲区。基本上,这可以使GPU在绘制时从多个顶点缓冲区中构建每个顶点。
使用Direct3D 11的一个简单示例(概念相同)将为每个组件使用不同的VB:
struct VertexStream1
{
float pos[3];
};
struct VertexStream2
{
float norm[3];
};
struct VertexStream3
{
float color[4];
}
可以通过输入布局来描述:
const D3D11_INPUT_ELEMENT_DESC InputElements[] =
{
// Semantic, SemanticIndex, Format, InputSlot, ...
{ "SV_Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 2, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
内部映射到“顶点着色器”输入,例如:
struct VSInputNmTx
{
float4 Position : SV_Position;
float3 Normal : NORMAL;
float2 TexCoord : TEXCOORD0;
};
在运行时,这需要您绑定(bind)三个VertexBuffer,每个VertexBuffer可以具有自己的“顶点跨度”。每个“顶点缓冲区”必须具有足够的条目以匹配要绘制的顶点数量。
ID3D11VertexBuffer* vertexBuffer[3] = …;
UINT vertexStride[3] = { sizeof(VertexStream1), sizeof(VertexStream2), sizeof(VertexStream3) };
UINT vertexOffset[3] = { 0, 0, 0 };
context->IASetVertexBuffers(0, 3, vertexBuffer, &vertexStride, &vertexOffset);