我如何在 SPIR-V 着色器的 OpenGL 中设置 sampler2D 制服?
How would I set sampler2D uniforms in OpenGL in a SPIR-V Shader?
我正在使用 glslangValidator 编译此着色器,并使用带有扩展名 GL_ARB_gl_spirv 的 OpenGL 4.3 Core Profile,并使用 GLAD 网络服务生成函数指针以访问 Core 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
只能是统一的。
从 GLSL 4.20 开始,您可以为任何 opaque type like samplers from GLSL code directly. This is done through the binding
layout
qualifier:
设置绑定点
layout(binding = #) uniform sampler2D inTexture;
这里的#
就是你要使用的任何绑定索引。这是绑定纹理时使用的索引:glActiveTexture(GL_TEXTURE0 + #)
。也就是说,您不再需要使用glProgramUniform
来设置制服的值;你已经在着色器中设置了它。
如果您想动态修改绑定(而您不应该),GLSL 4.30 提供了为任何非块设置位置的功能uniform
值来自 the location
layout
qualifier:
layout(location = #) uniform sampler2D inTexture;
这使得 #
制服的位置,您可以将其传递给任何 glProgramUniform
调用。
我正在使用 glslangValidator 编译此着色器,并使用带有扩展名 GL_ARB_gl_spirv 的 OpenGL 4.3 Core Profile,并使用 GLAD 网络服务生成函数指针以访问 Core 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
只能是统一的。
从 GLSL 4.20 开始,您可以为任何 opaque type like samplers from GLSL code directly. This is done through the binding
layout
qualifier:
layout(binding = #) uniform sampler2D inTexture;
这里的#
就是你要使用的任何绑定索引。这是绑定纹理时使用的索引:glActiveTexture(GL_TEXTURE0 + #)
。也就是说,您不再需要使用glProgramUniform
来设置制服的值;你已经在着色器中设置了它。
如果您想动态修改绑定(而您不应该),GLSL 4.30 提供了为任何非块设置位置的功能uniform
值来自 the location
layout
qualifier:
layout(location = #) uniform sampler2D inTexture;
这使得 #
制服的位置,您可以将其传递给任何 glProgramUniform
调用。