opengl - GLSL 中的 HLSL cbuffer 等效项

标签 opengl glsl hlsl

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/

相关文章:

opengl - GLSL 着色器 : occlusion order and culling

c++ - DirectX HLSL - 像素着色器中的常量缓冲区为空,但顶点着色器中没有

shader - 使用纹理图集时发生 HLSL 颜色渗色

c++ - OpenGl 读取和写入相同的纹理

c++ - 使用 openGL 的多纹理映射

c - 使用带有 CG 和 openGL 的统一一维纹理参数时出错

ios - 为什么纹理表面的透明和不透明区域之间存在暗边/光晕(在 opengl es 2.0 片段着色器中)

c++ - OpenGL 多纹理加载错误

c++ - opengl 4.1 替代方案将图像存储在 GPU 中以供以后访问、处理和渲染?

directx - 分支与纹理读取