Opengl 渲染四边形
Posted
技术标签:
【中文标题】Opengl 渲染四边形【英文标题】:Opengl rendering quad 【发布时间】:2018-06-27 13:03:32 【问题描述】:由于某种原因,我正在渲染的四边形没有显示,它只渲染黑屏。我已经检查了多次代码,找不到问题,也许有人能看到我看不到的东西!
目的是有一个跟随相机的四边形,现在我只想用单一颜色显示四边形,但我得到的只是黑屏。我正在使用QOpenGLWindow
和QOpenGLFunctions
。
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 渲染四边形的主要内容,如果未能解决你的问题,请参考以下文章