1

我正在使用 glslangValidator 编译此着色器,并使用扩展名为 GL_ARB_gl_spirv 的 OpenGL 4.3 核心配置文件,并使用 GLAD Web 服务生成函数指针以访问核心 OpenGL API,并使用 SDL2 来创建上下文(如果有任何用处)。

如果我有这样的片段着色器:

#version 430 core

//output Fragment Color
layout (location = 0) out vec4 outFragColor;

//Texture coordinates passed from the vertex shader
layout (location = 0) in vec2 inTexCoord;

uniform sampler2D inTexture;

void main()
{
    outFragColor = texture(inTexture, inTexCoord);
}

我将如何设置inTexture使用哪个纹理单元?

从我通过文档在线阅读的内容来看,我无法使用glGetUniformLocation该制服的位置来获取要使用的位置glUniform1i,因为我使用的是 SPIR-V,而不是直接使用 GLSL。

我需要做什么才能将其设置为时尚glUniform1i?我需要location在布局修饰符中设置吗?binding? _ 我尝试使用统一缓冲区对象,但显然sampler2D只能是统一的。

4

1 回答 1

2

从 GLSL 4.20 开始,您可以直接从 GLSL 代码中为任何不透明类型(例如采样器)设置绑定点。这是通过限定符完成binding layout

layout(binding = #) uniform sampler2D inTexture;

这里#是您想要使用的任何绑定索引。这是绑定纹理时使用的索引:glActiveTexture(GL_TEXTURE0 + #). 也就是说,您不再需要使用glProgramUniform来设置制服的值;您已经在着色器中设置了它。

如果你想动态修改绑定(你不应该),GLSL 4.30 提供了通过qualifier为任何非块uniform值设置位置的能力:location layout

layout(location = #) uniform sampler2D inTexture;

这使得#制服的位置,您可以将其传递给任何glProgramUniform呼叫。

于 2021-01-03T16:07:16.710 回答