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

侵略者

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

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

我需要提供用户界面,因此选择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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

OpenGL:如何通过一个变量将多个纹理传递给着色器?

来自分类Dev

OpenGL iOS将多个纹理传递给着色器

来自分类Dev

在OpenGL中将纹理传递给着色器

来自分类Dev

我应该如何处理两个仅共享相同着色器的QGLWidget?

来自分类Dev

如何将多个纹理传递给单个着色器?

来自分类Dev

将纹理传递给GLSL着色器而不使用统一?

来自分类Dev

OpenGL将颜色传递给片段着色器

来自分类Dev

如何使用glVertexAttribPointer将两个单独的数组附加到着色器?

来自分类Dev

如何将纹理数据从Objective C客户端传递到此openGL顶点着色器?

来自分类Dev

如何将制服传递给着色器

来自分类Dev

如何将结构数组传递给着色器

来自分类Dev

在LibGDX中将多个纹理传递给着色器

来自分类Dev

在LibGDX中将多个纹理传递给着色器

来自分类Dev

将float数组作为3D纹理传递给GLSL片段着色器

来自分类Dev

LibGDX-如何在单个着色器中渲染具有不同比例的两个纹理?

来自分类Dev

LibGDX-如何在单个着色器中渲染具有不同比例的两个纹理?

来自分类Dev

如何使用Swift将Float制服传递给iOS Metal着色器?

来自分类Dev

GLSL着色器:在两个以上的纹理之间插值

来自分类Dev

ThreeJS:首次尝试着色器-混合两个纹理

来自分类Dev

如何提高OpenGL着色器中的纹理访问性能?

来自分类Dev

Unity将多个纹理(数组)传递到着色器?

来自分类Dev

将属性传递给OpenGL顶点着色器的行为异常

来自分类Dev

OpenGL ES 2:将标量顶点属性传递给着色器程序

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

在OpenGL着色器中渲染纹理

来自分类Dev

为什么两个透明png照片的opengl着色器混合功能会变黑?

来自分类Dev

将统一值传递给顶点和片段着色器

来自分类Dev

GLSL:将char数组传递给片段着色器

Related 相关文章

  1. 1

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

  2. 2

    OpenGL:如何通过一个变量将多个纹理传递给着色器?

  3. 3

    OpenGL iOS将多个纹理传递给着色器

  4. 4

    在OpenGL中将纹理传递给着色器

  5. 5

    我应该如何处理两个仅共享相同着色器的QGLWidget?

  6. 6

    如何将多个纹理传递给单个着色器?

  7. 7

    将纹理传递给GLSL着色器而不使用统一?

  8. 8

    OpenGL将颜色传递给片段着色器

  9. 9

    如何使用glVertexAttribPointer将两个单独的数组附加到着色器?

  10. 10

    如何将纹理数据从Objective C客户端传递到此openGL顶点着色器?

  11. 11

    如何将制服传递给着色器

  12. 12

    如何将结构数组传递给着色器

  13. 13

    在LibGDX中将多个纹理传递给着色器

  14. 14

    在LibGDX中将多个纹理传递给着色器

  15. 15

    将float数组作为3D纹理传递给GLSL片段着色器

  16. 16

    LibGDX-如何在单个着色器中渲染具有不同比例的两个纹理?

  17. 17

    LibGDX-如何在单个着色器中渲染具有不同比例的两个纹理?

  18. 18

    如何使用Swift将Float制服传递给iOS Metal着色器?

  19. 19

    GLSL着色器:在两个以上的纹理之间插值

  20. 20

    ThreeJS:首次尝试着色器-混合两个纹理

  21. 21

    如何提高OpenGL着色器中的纹理访问性能?

  22. 22

    Unity将多个纹理(数组)传递到着色器?

  23. 23

    将属性传递给OpenGL顶点着色器的行为异常

  24. 24

    OpenGL ES 2:将标量顶点属性传递给着色器程序

  25. 25

    在OpenGL着色器中渲染纹理

  26. 26

    在OpenGL着色器中渲染纹理

  27. 27

    为什么两个透明png照片的opengl着色器混合功能会变黑?

  28. 28

    将统一值传递给顶点和片段着色器

  29. 29

    GLSL:将char数组传递给片段着色器

热门标签

归档