我正在写我的学生项目,有点问题。
我的任务是加载两个具有相同大小的纹理(图像和灰度蒙版),然后应用基于灰度蒙版的具有卷积核的模糊滤镜。
我需要提供用户界面,因此选择qt是因为它与opengl集成在一起。不幸的是,我对着色器和opengl等不是很熟悉,因此由于缺乏足够的知识而遇到了问题。
我的想法是绘制一个简单的平面并在其上应用两个纹理,即图像和蒙版,然后在着色器代码中,根据在蒙版图像中使用相应像素构建的3x3内核来计算新像素值。
不幸的是,我在着色器中有两个纹理存在问题,完全不知道该怎么做。
我在网络上发现了类似的东西,但是没有用。
// initializeGL(texture1,2和t1,t2是私有GLuint texture1 = bindTexture(data); texture2 = bindTexture(mask); 程序=新的QGLShaderProgram(); QGLShader * v =新的QGLShader(QGLShader :: Vertex); v-> compileSourceFile(“ vertex.vert”); v-> shaderId(); QGLShader * f =新的QGLShader(QGLShader :: Fragment); f-> compileSourceFile(“ texture.frag”); 程序-> addShader(v); 程序-> addShader(f); 程序->链接(); 程序-> bind(); 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); .... 绘画
片段着色器代码以统一变量声明开头为
均匀采样器2D Texture0; 均匀采样器2D Texture1;
有人可以告诉我这里有什么问题吗,或者我可以在哪里找到适当而又快速的知识来知道如何在着色器中应用两个纹理?
先感谢您。
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");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句