Opengl 渲染四边形

Posted

技术标签:

【中文标题】Opengl 渲染四边形【英文标题】:Opengl rendering quad 【发布时间】:2018-06-27 13:03:32 【问题描述】:

由于某种原因,我正在渲染的四边形没有显示,它只渲染黑屏。我已经检查了多次代码,找不到问题,也许有人能看到我看不到的东西!

目的是有一个跟随相机的四边形,现在我只想用单一颜色显示四边形,但我得到的只是黑屏。我正在使用QOpenGLWindowQOpenGLFunctions

void CSLFWindow::renderQuad()

    float x0 = -(float)1.f, y0 = -(float)1.f;
    float x1 = (float)1.f, y1 = (float)1.f;

    const QVector3D vertices[4] = 
        QVector3D( x0, y0, 0.0f),
        QVector3D( x0, y1, 0.0f),
        QVector3D( x1, y1, 0.0f),
        QVector3D( x1, y0, 0.0f)
    ;

    const QVector3D normals[4] = 
        QVector3D(0.0f, 0.0f,1.0f),
        QVector3D(0.0f, 0.0f,1.0f),
        QVector3D(0.0f, 0.0f,1.0f),
        QVector3D(0.0f, 0.0f,1.0f)
    ;
    const QVector2D texcoords[4] = 
        QVector2D(0.0f, 1.0f),
        QVector2D(0.0f, 0.0f),
        QVector2D(1.0f, 0.0f),
        QVector2D(1.0f, 1.0f)
    ;

      const unsigned int indices[4] =  3, 2, 1, 0 ;

    m_shaderProgram.enableAttributeArray("vVertices");
    m_shaderProgram.enableAttributeArray("vTexCoords");
    m_shaderProgram.enableAttributeArray("vNormals");

    m_shaderProgram.setAttributeArray("vVertices", vertices);
    m_shaderProgram.setAttributeArray("vTexCoords", texcoords);
    m_shaderProgram.setAttributeArray("vNormals", normals);

    glDrawElements(GL_QUADS, 4, GL_UNSIGNED_INT, indices);

    m_shaderProgram.disableAttributeArray("vVertices");
    m_shaderProgram.disableAttributeArray("vTexCoords");
    m_shaderProgram.disableAttributeArray("vNormals");

和渲染:

void CSLFWindow::paintGL()

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

      m_shaderProgram.bind();

      m_model.setToIdentity();
      m_view = m_camera.toMatrix();
      QMatrix4x4 modelMatrix = m_model ;
      QMatrix4x4 modelViewMatrix = m_view * modelMatrix;


      QMatrix4x4 mvp = m_projection * modelViewMatrix;

      m_shaderProgram.setUniformValue("MV", modelViewMatrix);

      m_shaderProgram.setUniformValue("MVP", mvp);           
      m_shaderProgram.setUniformValue("P", m_projection);      

      renderQuad();
      m_shaderProgram.release();

我将投影矩阵设置为:

m_view.setToIdentity();
float aspect = h / w;
m_projection.setToIdentity();
m_projection.perspective(
    m_fov,          
    aspect,         
    0.1f,           
    1000.0f);       

这是我的相机参数:

m_cameraPos   = QVector3D(0.0f, 0.0f,  3.0f);
m_cameraFront = QVector3D(0.0f, 0.0f,  -1.0f);
m_cameraUp    = QVector3D(0.0f, 1.0f,  0.0f); 

QMatrix4x4 toMatrix()

     QMatrix4x4 vMatrix;
     vMatrix.setToIdentity();
     vMatrix.lookAt(m_cameraPos,  QVector3D(0.0f, 0.0f,  0.0f), 
                    m_cameraUp);

     return vMatrix;
 

这是我的顶点着色器:

#version 330 core

layout (location = 0)in vec3 vVertices;
layout (location = 1)in vec2 vTexCoords;
layout (location = 2)in vec3 vNormals;

uniform mat4 MV;
uniform mat4 MVP;
uniform mat4 P;

out vec2 FragTexCoord;
out vec3 FragNormals;

void main()

   FragTexCoord = vTexCoords;
   FragNormals = vNormals;

   gl_Position = MVP * vec4(vVertices,1);

还有我的片段着色器:

#version 330 core

out vec4 fragmentColor;

in vec2 FragTexCoord;
in vec3 FragNormals;

void main()

    fragmentColor = vec4(1.0,1.0,1.0,1.0);

【问题讨论】:

如何设置要使用的 OpenGL 版本? glDrawElements(GL_QUADS...) 属于 OGL @Ripi2 好按照这个,glDrawElements 支持所有版本:khronos.org/registry/OpenGL-Refpages/gl4/html/… @Rabbid76 你的评论很有用,在确定这部分代码不是问题后,我发现问题出在设置表面格式!当我删除 format.setProfile(QSurfaceFormat::CoreProfile);我看到了四边形。但我不明白为什么会这样。 【参考方案1】:

我发现问题在于设置表面格式!当我删除 format.setProfile(QSurfaceFormat::CoreProfile);我看到了四边形。但我不明白为什么会这样

GL_QUAD 更改为GL_TRIANGLE_FAN 即可:

glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_INT, indices);

GL_QUAD 已弃用,并已在核心配置文件中删除。

进一步查看Legacy OpenGL - Removed functionality、OpenGL Context 和Forward compatibility

【讨论】:

【参考方案2】:

嘿,我不能添加评论,但你可以尝试像这样更改顶点着色器吗:

void main()


   FragTexCoord = vTexCoords;
   FragNormals = vNormals;

   gl_Position = vec4(vVertices,1);

如果您没有看到任何内容,请告诉我,如果您没有看到任何内容,请尝试更改索引的顺序

【讨论】:

我按照您的建议更改了顶点着色器,但它不起作用,我还更改了索引的顺序,但仍然相同。

以上是关于Opengl 渲染四边形的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 将字母 T 渲染为八边形 [重复]

渲染大量四边形的有效方法(LibGDX/OpenGL ES)

OpenGL的镶嵌

在 OpenGL 中渲染网格多边形 - 非常慢

如何为 OpenGL 文本渲染计算字符映射中的最佳字形边界

OpenGL 忽略四边形并将它们变成三角形