GLSL 中的 HLSL cbuffer 等价物

HLSL cbuffer equivalent in GLSL

HLSL 具有可用于查找表的 cbuffer 类型。

OpenGL 中 cbuffers 的等价物是什么?存储查找表的推荐方法是什么?

与 GLSL 中的 "cbuffer" 等效的功能是 uniform interface block, who's data comes from a buffer object. The totality of the concept is called a "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 或 cbuffer 描述为 "look-up-tables"。特别是在 HLSL 中,"cbuffer"s 是将统一数据传输到着色器的主要方式。