【问题标题】:What is a data stream in DirectX 9?DirectX 9 中的数据流是什么?
【发布时间】:2020-01-20 02:54:21
【问题描述】:

我正在用 Direct3D9 练习绘图,遇到了一个小问题。

比如d3ddev->SetStreamSource(1, NULL, 0, sizeof(CUSTOMVERTEX));中的第一个参数是指定“数据流”,但不知道是什么。

我已经把它画成我想要的形状了,但我还是不明白“数据流”是什么意思。

【问题讨论】:

    标签: c++ directx directx-9 data-stream direct3d9


    【解决方案1】:

    这在当时被称为“多流”顶点缓冲区。这基本上让 GPU 在从多个 Vertex Buffer 进行绘制期间构建每个顶点。

    一个使用 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,每个都可以有自己的“顶点步幅”。每个顶点缓冲区必须有足够的条目来匹配您正在绘制的顶点数。

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

    这不是真实世界使用的一个很好的例子,但它明白了重点。这也是用于“实例化”的语法,基本上您可以为一个或多个流设置一个“循环”。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-24
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      相关资源
      最近更新 更多