【问题标题】:HLSL cbuffer equivalent in GLSLGLSL 中的 HLSL cbuffer 等效项
【发布时间】:2016-03-20 23:58:14
【问题描述】:

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

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

【问题讨论】:

    标签: opengl glsl hlsl


    【解决方案1】:

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

    【讨论】:

    • 所以,如果我理解正确的话,我必须用glGenBuffers() 创建一个缓冲区并填写正确的字节。之后,我可以使用glUniformBlockBinding() 将生成的缓冲区分配给我的统一块。我可以假设浮点数和其他数据类型具有与我的 CPU 上相同的位级表示,因为我只能将字节分配给 VOB?
    • 这是否也适用于“tbuffer”而不仅仅是 GLSL 中的“cbuffer”?
    • @zezba9000:不。OpenGL 相当于“tbuffer”是buffer texture
    • 我的意思是如何在 GLSL 中定义“tbuffer”?我知道它只是一个纹理,但是如何在 GLSL 中定义它们,以便可以将它们用于 float4x4 数组,就像在 HLSL 中一样?
    • @zezba9000:GLSL 没有 D3D10 的“tbuffers”语法糖。缓冲区纹理是一种通过纹理访问来访问格式化数据的方法。没有糖可以让您假装这些访问正在访问结构或其他东西。
    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多