HLSL cbuffer相当于GLSL

时间:2016-03-20 14:41:35

标签: opengl glsl hlsl

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

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

1 个答案:

答案 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”是将着色数据统一到着色器的主要方式。