HLSL 具有可用于查找表的 cbuffer
类型。
OpenGL 中的 cbuffer
等效项是什么?存储查找表的推荐方式是什么?
最佳答案
GLSL 中“cbuffer”的等效功能是 uniform interface block ,谁的数据来自buffer object 。该概念的整体称为“Uniform Buffer Object”。尽管与 D3D 不同,OpenGL 不会将这些缓冲区标记为与任何其他类型的缓冲区对象有任何不同。因此,您可以使用相同的缓冲区对象来存储制服和顶点数据,或者(更有用)作为变换反馈操作的输出。或者其他什么。
在着色器中声明的统一 block 有点像 HLSL cbuffers,但采用 GLSL 样式:
uniform BlockName
{
vec4 someVariable;
} optionalInstanceName;
虽然 UBO 是 OpenGL 3.1 的一项功能,但如果您希望能够将 block 与着色器中的绑定(bind)索引关联起来,则需要使用 OpenGL 4.2 或 ARB_shading_language_420pack:
//BlockName uses binding point 0.
layout(binding = 0) uniform BlockName
{
vec4 someVariable;
} optionalInstanceName;
如果没有此功能,您必须使用 glUniformBlockBinding
手动设置名为 BlockName
的 block 的绑定(bind)点。不过首先您必须使用 glGetUniformBlockIndex
查询该 block 的索引。但一旦设置,它就是程序对象状态的一部分,因此您不需要多次设置它。
无论如何,我不会将 UBO 或 cbuffers 描述为“查找表”。特别是在 HLSL 中,“cbuffer”是向着色器获取统一数据的主要方式。
关于opengl - GLSL 中的 HLSL cbuffer 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36115095/