【问题标题】:Why is this triangle strip only painting a third of the screen? [closed]为什么这个三角形条只画了屏幕的三分之一? [关闭]
【发布时间】:2018-06-15 18:39:28
【问题描述】:

我正在尝试制作一个玩具来在整个屏幕上“绘制”片段着色器。为此,我试图用一个三角形条“填充”屏幕。我正在为此使用 QT,因为除了 openGL 渲染之外,我还有一个想要使用的 UI。

我基于全屏三角条技术: https://github.com/Gargaj/Bonzomatic/blob/master/src/platform_glfw/Renderer.cpp

static const char *fragmentShaderSource =
        "varying mediump vec4 color;\n"
        "void main(void)\n"
        "{\n"
        "    gl_FragColor = vec4(1.0,0.0,0.0,0.0);\n"
        "}\n";


static float pFullscreenQuadVertices[] =
    {
      -1.0, -1.0,  0.5, 0.0, 0.0,
      -1.0,  1.0,  0.5, 0.0, 1.0,
       1.0, -1.0,  0.5, 1.0, 0.0,
       1.0,  1.0,  0.5, 1.0, 1.0,
    };

static const char *szVertexShader =
      "#version 410 core\n"
      "in vec3 in_pos;\n"
      "in vec2 in_texcoord;\n"
      "out vec2 out_texcoord;\n"
      "void main()\n"
      "{\n"
      "  gl_Position = vec4( in_pos.x, in_pos.y, in_pos.z, 1.0 );\n"
      "  out_texcoord = in_texcoord;\n"
      "}";


void DemoRender::initializeGL(){
         m_background = qRgb(255,255,255);
         initializeOpenGLFunctions();
         m_program = new QOpenGLShaderProgram(this);
         m_program->addShaderFromSourceCode(QOpenGLShader::Vertex, szVertexShader);
         m_program->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
         m_program->link();
         m_program->log();
         m_posAttr = m_program->attributeLocation("in_pos");

         m_vao1.create();
         m_vao1.bind();



}


void DemoRender::paintGL(){
        QPainter painter;
        painter.begin(this);

        painter.beginNativePainting();
        glClearColor(m_background.redF(), m_background.greenF(), m_background.blueF(),0.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        //glFrontFace(GL_CW);
        //glCullFace(GL_FRONT);
        //glEnable(GL_CULL_FACE);
        //glEnable(GL_DEPTH_TEST);
        glClear(GL_COLOR_BUFFER_BIT);

        m_program->bind();
        drawFullScreen();
        m_program->release();
           //glDisable(GL_DEPTH_TEST);
           //glDisable(GL_CULL_FACE);

           painter.endNativePainting();

           painter.end();

           update();


}

void DemoRender::drawFullScreen(){

    m_vao1.bind();

    m_vbo1.create();
    m_vbo1.bind();
    m_vbo1.allocate(pFullscreenQuadVertices,sizeof(pFullscreenQuadVertices)*sizeof(float));
    m_vbo1.write(0,pFullscreenQuadVertices,sizeof(pFullscreenQuadVertices));


    m_program->enableAttributeArray(m_posAttr);

    //m_vbo1.release();
    //I suspect you are the culprit, but I don't know how to fix it. 
    m_program->setAttributeBuffer(m_posAttr, GL_FLOAT, 0, 3);

    m_vbo1.release();

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);


    m_program->disableAttributeArray(m_posAttr);

}

作为一种调试技术,我告诉片段着色器让每个像素都变成红色。现在,我的困惑是:为什么只有大约三分之一的屏幕变红?

看起来顶点着色器没有覆盖整个屏幕空间。我能做些什么来解决这个问题?

我目前的理论是,由于顶点数组的设置方式的一些细节,三角形条没有正确渲染,但是因为 qt 不会让我做这种 C 风格,所以我不能遵循原作者的代码一一个。

【问题讨论】:

  • setAttributeBuffer 是 QT 的一部分...你想让我在示例中包含 QT 的库代码吗?
  • 这是使用 QT 的 OpenGL 绑定及其库函数。就像我在原帖中所说的那样,我不能以 C 风格的方式做所有事情,因为它掩盖了对某些 C 函数的访问。
  • setAttributeBuffer 的第三个参数是偏移量...你的意思是我应该张贴 5*sizeof(float) 作为步幅吗?如果它采用 3 的元组,为什么步幅会是 5?
  • 应该是m_program->setAttributeBuffer(m_posAttr, GL_FLOAT, 0, 3, 5*sizeof(float))。 qt 中的订单是type, offset, size, stride。必须设置步幅,因为每个新顶点在最后一个顶点之后开始 5 个浮点数。您的数组包含位置和两个附加值,因此必须手动设置步幅。

标签: c++ qt opengl


【解决方案1】:

顶点属性指针,特别是步幅,是错误的。数据包含一个 3 个分量的位置和两个额外的浮点数,但默认步幅假定紧密包装。正确的代码应该是:

m_program->setAttributeBuffer(m_posAttr, GL_FLOAT, 0, 3, 5*sizeof(float))

其中5 * sizeof(float) 是一个顶点的起点和下一个顶点的起点之间的偏移量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2020-02-22
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多