如何在SPIR-V着色器中设置OpenGL中的二维制服?

如何在SPIR-V着色器中设置OpenGL中的二维制服?,opengl,spir-v,Opengl,Spir V,我正在使用glslangValidator编译这个着色器,并且正在使用OpenGL 4.3核心概要文件和扩展GL_ARB_GL_spirv,并使用GLAD webservice生成函数指针来访问核心OpenGL API,以及SDL2来创建上下文(如果有用的话) 如果我有这样一个片段着色器: #version 430 core //output Fragment Color layout (location = 0) out vec4 outFragColor; //Texture coord

我正在使用glslangValidator编译这个着色器,并且正在使用OpenGL 4.3核心概要文件和扩展GL_ARB_GL_spirv,并使用GLAD webservice生成函数指针来访问核心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
?是否需要在布局修改器中设置
位置
绑定
?我尝试使用统一缓冲区对象,但显然
sampler2D
只能是统一的。

自GLSL 4.20以来,您可以直接从GLSL代码为任何类似的采样器设置绑定点。这是通过:

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

如果您想动态修改绑定(您不应该这样做),GLSL 4.30提供了通过以下方式为任何非块
uniform
值设置位置的功能:


这使
#
成为制服的位置,您可以将其传递给任何
glprogrammuniform
调用。

您需要制服的布局和装订。例如
layout(binding=1)统一采样器2D接口
@DhirajWishal在那之后,我如何从我的主程序中编辑
sampler2D
?@DhirajWishal我是否只需将
1
输入
glUniform
?我个人对OpenGL没有太多经验,但在Vulkan。所以我想你可以让它与
glUniform1i
一起工作,尽管我不是100%确定。据我所知,使用SPIR-V与OpenGL协同工作并非易事。@DhirajWishal到目前为止,它似乎与
glUniform1i
协同工作。谢谢你的帮助。
layout(binding = #) uniform sampler2D inTexture;
layout(location = #) uniform sampler2D inTexture;