我可以将单个常量缓冲区设置为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);
答案 0 :(得分:1)
是的,OpenGL不禁止对不同的统一块索引使用相同的缓冲区。它也不禁止将相同的纹理绑定到多个纹理图像单元。类似的事情。
对于UBO,这在几种情况下确实有用:
绑定同一缓冲区的不同区域。或者换句话说,将多种数据存储在同一缓冲区对象的不同区域中。
如果不同的着色器阶段使用不同的缓冲区绑定点,但客户端代码希望为特定的渲染操作提供相同的数据。
但是如果你绑定同一个着色器阶段使用的同一个缓冲区的相同区域......你可以用它做真正有用的东西。您将在该阶段只有两个统一的块,它们是相同数据的副本。