【问题标题】:Set single constant buffer to multiple locations将单个常量缓冲区设置为多个位置
【发布时间】:2016-04-30 12:48:09
【问题描述】:

我可以将单个常量缓冲区设置到 D3D11 和 OpenGL 中的多个位置吗?这种方法有什么优势?我真的需要这个吗?你能想到你会使用它的案例吗?

D3D11 的梦想示例:

ID3D11Buffer* bufs[3] = { pBuffer1, pBuffer1, pBuffer1 };
dc->PSSetConstantBuffers(0, 3, &bufs[0]);

还有 OpenGL:

glBindBufferBase(GL_UNIFORM_BUFFER, 0, buffer1);
glBindBufferBase(GL_UNIFORM_BUFFER, 1, buffer1);
glBindBufferBase(GL_UNIFORM_BUFFER, 2, buffer1);

【问题讨论】:

  • 我不知道你在问什么,但这可能是因为我不知道这是要解决什么问题。如果不只是我,请尝试使用更多信息更新问题,也许还有文章链接。除此之外,我看不出有什么理由不允许这样做,我也看不出这有什么用处。
  • 如果您进行双面渲染并为正面和背面指定单独的材质(在两个单独的缓冲区中),这可能会很有用。然后,您可以通过设置相同的缓冲区为正面/背面设置相同的材质。
  • 好的,很公平,找到了用例 :-) 有人知道它是否允许吗?

标签: opengl directx


【解决方案1】:

是的,OpenGL 不禁止对不同的统一块索引使用相同的缓冲区。它也不禁止将相同的纹理绑定到多个纹理图像单元。还有类似的事情。

对于 UBO,这在几种情况下会非常有用:

  1. 绑定同一缓冲区的不同区域。或者换一种说法,在同一个缓冲区对象的不同区域存储多种数据。

  2. 如果不同的着色器阶段使用不同的缓冲区绑定点,但客户端代码希望为特定的渲染操作提供相同的数据。

但是,如果您要绑定同一缓冲区的同一区域以供同一着色器阶段使用……那么您可以做的真正有用的事情并不多。在该阶段,您只需拥有两个统一的块,它们是相同数据的副本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多