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

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

我的任务是加载两个相同大小的纹理(图像和灰度蒙版),然后应用基于灰度蒙版的卷积内核的模糊滤镜。

我需要提供用户界面,所以我选择了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");

然后在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

片段着色器代码以统一变量声明开始


    uniform sampler2D Texture0;
    uniform sampler2D 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");
链接地址: http://www.djcxy.com/p/33987.html

上一篇: How to pass two textures to opengl shader with qt and qglwidget

下一篇: Applying simple texture on a shader material