如何使用qt和qglwidget将两个纹理传递给opengl着色器

如何使用qt和qglwidget将两个纹理传递给opengl着色器,qt,opengl,glsl,shader,texture-mapping,Qt,Opengl,Glsl,Shader,Texture Mapping,我正在写我的学生项目,有点问题 我的任务是加载两个大小相同的纹理(图像和灰度遮罩),然后 应用基于灰度掩模的卷积核模糊滤波器 我需要提供用户界面,所以我选择qt,因为它与opengl集成。 不幸的是,我对着色器和opengl等不太熟悉,因此由于缺乏大量知识,我遇到了一些问题 我的想法是画一个简单的平面,在上面应用两个纹理,一个图像和遮罩,然后在着色器代码中,根据遮罩图像中相应像素构建的3x3内核计算新像素值 不幸的是,我在着色器中有两个纹理的问题,完全不知道怎么做 我在网络上找到了类似的东西,但

我正在写我的学生项目,有点问题

我的任务是加载两个大小相同的纹理(图像和灰度遮罩),然后 应用基于灰度掩模的卷积核模糊滤波器

我需要提供用户界面,所以我选择qt,因为它与opengl集成。 不幸的是,我对着色器和opengl等不太熟悉,因此由于缺乏大量知识,我遇到了一些问题

我的想法是画一个简单的平面,在上面应用两个纹理,一个图像和遮罩,然后在着色器代码中,根据遮罩图像中相应像素构建的3x3内核计算新像素值

不幸的是,我在着色器中有两个纹理的问题,完全不知道怎么做

我在网络上找到了类似的东西,但它不起作用

// initializeGL (texture1,2 and t1,t2 are private GLuint texture1 = bindTexture(data); texture2 = bindTexture(mask); program = new QGLShaderProgram(); QGLShader *v = new QGLShader(QGLShader::Vertex); v->compileSourceFile("vertex.vert"); v->shaderId(); QGLShader *f = new QGLShader(QGLShader::Fragment); f->compileSourceFile("texture.frag"); program->addShader(v); program->addShader(f); program->link(); program->bind(); t1 = glGetUniformLocation(v->shaderId(), "Texture0"); t2 = glGetUniformLocation(v->shaderId(), "Texture1"); //初始化EGL(纹理1,2和t1,t2为专用胶粘胶 纹理1=绑定纹理(数据); 纹理2=绑定纹理(遮罩); 程序=新的QGLShaderProgram(); QGLShader*v=新的QGLShader(QGLShader::顶点); v->compileSourceFile(“vertex.vert”); v->shaderId(); QGLShader*f=新的QGLShader(QGLShader::Fragment); f->compileSourceFile(“texture.frag”); 程序->添加着色器(v); 程序->添加着色器(f); 程序->链接(); 程序->绑定(); t1=glGetUniformLocation(v->shaderId(),“Texture0”); t2=glGetUniformLocation(v->shaderId(),“Texture1”); 然后在paintGL中从

glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texture1); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, texture2); glUniform1i(t1, 0); glUniform1i(t2, 1); glBegin(GL_QUADS); .... drawing 玻璃纹理(GL_纹理0); glBindTexture(GL_TEXTURE_2D,texture1); 玻璃结构(GL_纹理1); glBindTexture(GL_TEXTURE_2D,texture2); glUniform1i(t1,0); glUniform1i(t2,1); glBegin(GLU四边形);…图纸 其中片段着色器代码以统一变量声明开始,如下所示

uniform sampler2D Texture0; uniform sampler2D Texture1; 均匀采样2D纹理0; 均匀的二维纹理1; 有没有人能告诉我这里出了什么问题,或者我在哪里可以找到正确但快速的知识,如何实现在着色器中应用两种纹理

提前感谢。

glGetUniformLocation(…)
在链接的GLSL程序上运行,而不是在着色器上运行。 您可能会认为,由于制服出现在单个着色器中,因此它们特定于特定的着色器对象,但事实并非如此。事实上,GLSL制服甚至在GLSL程序的所有阶段(顶点、片段、几何体等)之前都不会指定位置链接在一起。不影响最终输出的制服将被删除,并且没有位置(
glGetUniformLocation(…)
返回-1

要解决问题,您需要做的是替换以下行: 为此:
哇,我无法想象我浪费了多少时间让它工作。你的解决方案非常棒。非常感谢。
t1  = glGetUniformLocation(v->shaderId(), "Texture0");
t2 = glGetUniformLocation(v->shaderId(), "Texture1");
t1  = glGetUniformLocation(program->programId(), "Texture0");
t2 = glGetUniformLocation(program->programId(), "Texture1");