DirectX 9中的数据流是什么?

问题描述 投票:1回答:1

所以我很困惑。我在Direct3D9中练习绘图,遇到了一个小问题。我对数据流是什么感到困惑。例如,d3ddev->SetStreamSource(1, NULL, 0, sizeof(CUSTOMVERTEX));中的第一个参数是指定数据流,但我不知道那是什么。我已经绘制出想要的形状,但是我仍然不理解数据流。我已经做过研究,但是我仍然很困惑。如果有人可以帮助清除它,那就太好了。先谢谢了!

c++ directx directx-9 data-stream direct3d9
1个回答
2
投票

这在过去被称为“多流”顶点缓冲区。这基本上可以让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;
};

在运行时,这需要您绑定三个VertexBuffer,每个VertexBuffer可以具有自己的'vertex stride'。每个顶点缓冲区必须具有足够的条目以匹配您要绘制的顶点数量。

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);

这不是现实世界用法的一个很好的例子,但是它可以说明要点。这也是用于“实例化”的语法,基本上,您可以在其中为一个或多个流设置一个“循环”。

© www.soinside.com 2019 - 2024. All rights reserved.