【发布时间】:2016-03-20 23:58:14
【问题描述】:
HLSL 具有可用于查找表的cbuffer 类型。
OpenGL 中cbuffers 的等价物是什么?存储查找表的推荐方式是什么?
【问题讨论】:
HLSL 具有可用于查找表的cbuffer 类型。
OpenGL 中cbuffers 的等价物是什么?存储查找表的推荐方式是什么?
【问题讨论】:
GLSL 中“cbuffer”的等效功能是uniform interface block,其数据来自buffer object。这个概念的整体被称为“Uniform Buffer Object”。尽管与 D3D 不同,OpenGL 不会将这些缓冲区标记为与任何其他类型的缓冲区对象有任何不同。因此,您可以使用相同的缓冲区对象来存储制服和顶点数据,或者(更有用)作为变换反馈操作的输出。或者其他。
在着色器中声明统一块有点像 HLSL cbuffers,但采用 GLSL 样式:
uniform BlockName
{
vec4 someVariable;
} optionalInstanceName;
虽然 UBO 是 OpenGL 3.1 功能,但如果您希望能够将块与着色器中的绑定索引相关联,则需要使用 OpenGL 4.2 或 ARB_shading_language_420pack:
//BlockName uses binding point 0.
layout(binding = 0) uniform BlockName
{
vec4 someVariable;
} optionalInstanceName;
如果没有此功能,您必须使用glUniformBlockBinding 手动设置名为BlockName 的块的绑定点。虽然首先您必须使用glGetUniformBlockIndex 查询该块的索引。但是一旦设置,它就是程序对象状态的一部分,所以你不需要设置多次。
无论如何,我不会将 UBO 或 cbuffers 描述为用于“查找表”。特别是在 HLSL 中,“cbuffer”是获取统一数据到着色器的主要方式。
【讨论】:
glGenBuffers() 创建一个缓冲区并填写正确的字节。之后,我可以使用glUniformBlockBinding() 将生成的缓冲区分配给我的统一块。我可以假设浮点数和其他数据类型具有与我的 CPU 上相同的位级表示,因为我只能将字节分配给 VOB?