GLSL 中的 HLSL cbuffer 等价物
HLSL cbuffer equivalent in GLSL
HLSL 具有可用于查找表的 cbuffer
类型。
OpenGL 中 cbuffer
s 的等价物是什么?存储查找表的推荐方法是什么?
与 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 是将统一数据传输到着色器的主要方式。
HLSL 具有可用于查找表的 cbuffer
类型。
OpenGL 中 cbuffer
s 的等价物是什么?存储查找表的推荐方法是什么?
与 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 是将统一数据传输到着色器的主要方式。