【问题标题】:How to draw red lines if I used a fragment shader for texture?如果我对纹理使用片段着色器,如何绘制红线?
【发布时间】:2015-07-04 21:31:17
【问题描述】:

我正在使用 opengl 编写一个简单的视频播放器。我使用了 Qt 并遵循了它的基本纹理示例。 顶点和片段着色器在这里:

    QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
    const char *vsrc =
        "attribute highp vec4 vertex;\n"
        "attribute mediump vec4 texCoord;\n"
        "varying mediump vec4 texc;\n"
        "uniform mediump mat4 matrix;\n"
        "void main(void)\n"
        "{\n"
        "    gl_Position = matrix * vertex;\n"
        "    texc = texCoord;\n"
        "}\n";
    vshader->compileSourceCode(vsrc);

    QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
    const char *fsrc =
        "uniform sampler2D texture;\n"
        "varying mediump vec4 texc;\n"
        "void main(void)\n"
        "{\n"
        "    gl_FragColor = texture2D(texture, texc.st);\n"
        "}\n";
    fshader->compileSourceCode(fsrc);

我这样做是为了显示图像:

glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texture_cv.cols, texture_cv.rows,  GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data);
//then draw a quad
...

然后我怎么能在屏幕上画几条红线,因为我使用的是片段着色器(我对着色器很陌生),我无法关闭纹理。

【问题讨论】:

    标签: c++ qt opengl


    【解决方案1】:

    到目前为止,最简单的解决方案是使用不同的着色器程序来绘制红线。由于它只是绘制纯色,因此非常容易。片段着色器可能类似于:

    void main()
    {
        gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
    }
    

    顶点着色器将与您拥有的非常相似,只是它不需要生成纹理坐标。您甚至可以使用现有的顶点着色器。

    使用多个着色器程序进行渲染是很常见的。每种不同类型的渲染都有一个着色器程序,并使用glUseProgram() 在它们之间切换。

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多