【问题标题】:SV_PrimitiveID and primitives in direct3D 11direct3D 11 中的 SV_PrimitiveID 和基元
【发布时间】:2021-04-08 14:00:16
【问题描述】:

我在文档中看到 SV_PrimitiveID 语义,它说它为每个基元创建一个 ID 在每个绘图调用中都是独一无二的。

我在几何着色器中看到了这种语义,我对 primitive 一词感到困惑。 我有一个带有立方体和球体顶点的顶点缓冲区,SV_PrimitiveID 是否索引立方体顶点 0 和球体 1,或者对于顶点缓冲区中的每个三角形,它都会给出一个数字(想象 GS 输入三角形列表)。 我也不知道第一种情况是否属实,当它们都在一个顶点缓冲区中时,它如何区分立方体和球体。

【问题讨论】:

    标签: directx-11 hlsl primitive


    【解决方案1】:

    SV_PrimitiveID 的含义由D3D11_PRIMITIVE_TOPOLOGY 确定(由ID3D11DeviceContext::IASetPrimitiveTopology 设置)。每个绘制调用每个图元都被分配一个编号,以便绘制图元。

    例如:

    // buffers that will be copied to the gpu
    struct Vertex { float X, Y, Z; } VertexData[6] =
    {
        { 0, 0, 0 },
        { 1, 0, 0 },
        { 1, 1, 0 },
    
        { 1, 1, 0 },
        { 0, 1, 0 },
        { 0, 0, 0 },
    };
    
    struct Triangle { int A, B, C; } IndexData[2] =
    {
        { 0, 1, 2 },// SV_PrimitiveID == 0
        { 2, 4, 0 },// SV_PrimitiveID == 1
    };
    
    struct Instance { float X, Y, Z; } InstanceData[2] =
    {
        { 0, 0, 0 },// SV_InstanceID == 0
        { 0, 0, 1 },// SV_InstanceID == 1
    };
    
    ...
        pDeviceConstext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
        pDeviceConstext->Draw(6, 0);// would result in two triangles numbered (value of SV_PrimitiveID) 0 and 1
        pDeviceConstext->DrawIndexed(2 * 3, 0, 0);// same thing
        pDeviceConstext->DrawInstanced(6, 2, 0, 0);// now 4 triangles, 2 for the 0th instance and 2 for the 1st; SV_PrimitiveID restarts from zero for every instance!
    ...
    
    

    我不确定几何着色器和 SV_PrimitiveID 之间的交互,但 DirectX 有据可查。以下是一些链接:

    https://docs.microsoft.com/en-us/windows/win32/direct3d11/geometry-shader-stage https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-geometry-shader

    我个人觉得直观地显示任何我可能会感到困惑的信息很有用。例如设置像这样的像素着色器:

    float4 main(uint pid : SV_PrimitiveId) : SV_Target
    {
        static const uint N = 16;
        float3 color = float3(((pid / uint3(1, N, N * N)) % N) / (float)N);
        return float4(color, 1);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多