HLSL具有cbuffer
类型,可用于查找表。
OpenGL中cbuffer
的等价物是什么?存储查找表的推荐方法是什么?
答案 0 :(得分:2)
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”是将着色数据统一到着色器的主要方式。