【问题标题】:direct x 11 creating vertex buffers intelligentlydirect x 11 智能地创建顶点缓冲区
【发布时间】:2012-07-17 00:57:29
【问题描述】:

我遇到了一个让我很头疼的难题。假设我有几个着色器,它们都具有不同的顶点类型,如下所示:

// light shader
struct vertexInputType
{
    float4 position : POSITION;
    float2 tex : TEXCOORD0;
    float3 normal : NORMAL;
};

// color shader
struct vertexInputType
{
    float4 position : POSITION;
    float4 color : COLOR;
};

// bump mapping shader
struct vertexInputType
{
    float4 position : POSITION;
    float2 tex : TEXCOORD0;
    float3 normal : NORMAL;
    float3 binormal : BINORMAL;
    float3 tangent : TANGENT;
};

现在假设我有一个包含所有这些数据的模型。我不能完全将它全部放在同一个缓冲区中并按照我选择的所有 3 个进行渲染,因为数据的布局不正确。我只看到了两个使这成为可能的选择,它们都一样痛苦。

1) 我可以在 ram 中有一个大缓冲区来保存所有数据,然后每次绘制调用,我从着色器对象中获取顶点类型,并使用正确的信息创建一个新的顶点缓冲区。如您所见,这会非常慢。

或者...

2) 我可以在模型初始化时创建多个 ID3D11Buffers,其中一个缓冲区具有位置和颜色,一个具有位置、texcoord 和法线,一个具有位置、texcoord、法线、副法线和切线,以及模型具有信息的任何其他顶点类型都需要许多缓冲区。相比之下,这会抹杀你可用的 vram,这也使它成为一个 nogo。

我看不出有任何其他方法可以做到这一点。你们其他 d3d 人是怎么做到的?

【问题讨论】:

    标签: c++ directx-11


    【解决方案1】:

    您在 DX11 上下文中询问这个问题是件好事 - ID3D11InputLayout 与以前的版本相比,大大简化了这个概念。您可以使用CreateInputLayout 为您的顶点数据创建多个布局(一个用于您在上面提供的每个结构)并在您希望相同顶点缓冲区的点使用正确的布局调用IASetInputLayout解释不同。

    编辑:查看 here 以获取创建 Input-Layout 对象的示例。

    希望这会有所帮助!

    【讨论】:

    • 是的,到目前为止,我在为着色器创建输入布局时使用教程,但现在我很好奇输入布局是如何设置的。你是说我可以拥有一个 ID3D11Buffer 来保存所有数据,如位置、颜色、法线、纹理等,然后可以设置布局以选择此着色器的各个元素?我该怎么做?现在我只定义第一个输入 desc 元素,它的对齐字节偏移成员为 0,然后用 D3D11_INPUT_PER_VERTEX_DATA 定义其余元素; .我想要这样做的背后的方法是什么?
    • 糟糕意味着其余的设置为 D3D11_APPEND_ALIGNED_ELEMENT。复制粘贴在它下面的那个:P
    • 哇,现在我知道它与输入布局有关,我只是设法在谷歌上搜索了 THIS 文章。有点解释了我需要知道的一切:\。感谢您让我走上正轨!
    • 只是对所有内容进行了长时间的编辑,但您的链接效果更好。我将把它作为编辑添加到我的答案中,这样以后来的人就不必在 cmets 中四处寻找了。
    • 哎呀,很抱歉浪费了您的时间,我猜:\。不过,感谢您的帮助。
    【解决方案2】:

    诀窍是将数据分成流:P、T、A。

    流 P 包含位置和法线。需要此数据来渲染带有光照的顶点。您还可以包含副法线和顶点颜色数据。

    Stream T 包含纹理信息,因此最多可以有 8 个 TU 通道。应注意存储在此流中编码的通道数,以确保不会浪费内存带宽在 GPU 总线上复制空通道。

    流 A 包含动画信息、骨骼权重等。

    根据渲染管道的架构,您可以拥有更多或更少的通道。这里的诀窍是使用 FVF 动态定义您的数据布局。这种架构的一个优点是优化内存带宽使用。当需要多个渲染通道但并非每次渲染都需要所有数据时,这一点尤其重要。

    【讨论】:

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