GLSL统一布局绑定和纹理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GLSL统一布局绑定和纹理相关的知识,希望对你有一定的参考价值。

当制服使用布局绑定时,我对于绑定纹理的正确方法有点困惑。

layout(binding = 0, std140) uniform uCommon
{
    mat4 projectionMatrix;
    mat4 viewMatrix;
};

layout(binding = 1, std140) uniform uModel
{
    mat4 modelViewProjectionMatrix;
};

layout(binding = 3) uniform sampler2D uTexture;

要绑定我的第一个纹理,我应该使用“GL_TEXTURE0 + 3”?

glActiveTexture(GL_TEXTURE0 + 3);
glBindTexture(GL_TEXTURE_2D, textureId);

这是正确的方法吗?

编辑:或者是采样器使用与其他制服分开的绑定?我可以用吗:

layout(binding = 0) uniform sampler2D uTexture;

还在使用

layout(binding = 0, std140) uniform uCommon
答案

统一块绑定索引与采样器绑定位置无关。这些是不同的东西。

用于指定绑定点或单位的整数常量表达式在关键字binding的所有用法中都不是唯一的。

OpenGL Shading Language 4.60 Specification; 4.4.5 Uniform and Shader Storage Block Layout Qualifiers; page 77

绑定标识符指定对应于统一或着色器存储块的统一缓冲区绑定点,其将用于获取块的成员变量的值。

OpenGL Shading Language 4.60 Specification; 4.4.6 Opaque-Uniform Layout Qualifiers; page 79

图像和采样器类型都采用统一布局限定符标识符进行绑定:

layout-qualifier-id :
    binding = integer-constant-expression

标识符绑定指定将绑定哪个单元。

以上是关于GLSL统一布局绑定和纹理的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL、GLSL 片段着色器无法读取 Sampler2D 纹理

在GLSL ES中的片段着色器上旋转纹理

GLSL 多纹理 - 混合纹理

将整数渲染到 GLSL 中的单独纹理

如果未绑定,统一值是不是保留在 GLSL 着色器中?

OpenGL和GLSL中的glTexParameter和过滤?