QtQuick QQuickItem渲染简单的三角形用四边形填满整个屏幕
QtQuick QQuickItem Rendering Simple Triangle Fills the Whole Screen With Quad
正在修改此处找到的示例 http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html。我相信我有一个正确的 OpenGL 程序,但它似乎没有使用 Qt 的包装器 类 正确渲染。就像上面的示例一样,在连接好所有内容后,我只修改了 paint 函数。如下所示:
void MainScreenRenderer::paint()
{
if (!m_ShaderProgram) {
initializeOpenGLFunctions();
m_ShaderProgram = new QOpenGLShaderProgram();
m_ShaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute vec4 vertex;"
"uniform mat4 mvp;"
""
"void main() {"
" gl_Position = mvp * vertex;"
"}");
m_ShaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment,
"void main() {"
" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"
"}");
m_ShaderProgram->bindAttributeLocation("vertex", 0);
m_ShaderProgram->link();
}
glViewport(0, 0, m_ViewportSize.width(), m_ViewportSize.height());
m_ShaderProgram->bind();
m_ShaderProgram->enableAttributeArray(0);
GLfloat values[] = {
-1.0, -1.0, +0.0, +0.0,
+1.0, -1.0, +0.0, +0.0,
+0.0, +1.0, +0.0, +0.0,
};
QMatrix4x4 model;
QMatrix4x4 view;
view.lookAt(QVector3D(0.0, 0.0, 10.0), QVector3D(0.0, 0.0, 0.0),
QVector3D(0.0, 1.0, 0.0));
QMatrix4x4 projection;
float aspect = m_ViewportSize.width() / ((m_ViewportSize.height()) ?
m_ViewportSize.height() : 1);
projection.perspective(45.0, aspect, 1.0, 1000.0);
m_MVP = model * view * projection;
m_ShaderProgram->setAttributeArray(0, GL_FLOAT, values, 4);
m_ShaderProgram->setUniformValue("mvp", m_MVP);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
m_ShaderProgram->disableAttributeArray(0);
m_ShaderProgram->release();
}
无论我将相机拉回多远,或重新调整 window 的大小,投影似乎都没有效果,它只是将整个 window 呈现为红色,甚至不接受这个事实我只是告诉它渲染一个有 3 个点的三角形。如下所示。
根据评论进行了以下更改,但现在我看到的只是黑屏。
... // Vertex Shader
gl_Position = mvp * vec4(vertex, 1.0);"
...
... // Data
GLfloat values[] = {
-1.0, -1.0, +0.0,
+1.0, -1.0, +0.0,
+0.0, +1.0, +0.0,
};
...
... // Vertex Attribution Setup
m_ShaderProgram->setAttributeArray(0, GL_FLOAT, values, 3); // Tuple is only 3 tightly packed.
...
根据我对您的模型视图和投影矩阵的观察,如果您将相机定位在 z=1.0,则该三角形位于您的近裁剪平面上。尝试将眼睛位置沿 z 轴向下移动几个单位。理想情况下,您将从 NDC space(身份模型视图和投影矩阵)开始,然后一旦您在屏幕上看到一个三角形,就开始引入相机变换;婴儿步骤 ;) – Andon M. Coleman 3 月 6 日 20:33
正在修改此处找到的示例 http://doc.qt.io/qt-5/qtquick-visualcanvas-scenegraph.html。我相信我有一个正确的 OpenGL 程序,但它似乎没有使用 Qt 的包装器 类 正确渲染。就像上面的示例一样,在连接好所有内容后,我只修改了 paint 函数。如下所示:
void MainScreenRenderer::paint()
{
if (!m_ShaderProgram) {
initializeOpenGLFunctions();
m_ShaderProgram = new QOpenGLShaderProgram();
m_ShaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute vec4 vertex;"
"uniform mat4 mvp;"
""
"void main() {"
" gl_Position = mvp * vertex;"
"}");
m_ShaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment,
"void main() {"
" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"
"}");
m_ShaderProgram->bindAttributeLocation("vertex", 0);
m_ShaderProgram->link();
}
glViewport(0, 0, m_ViewportSize.width(), m_ViewportSize.height());
m_ShaderProgram->bind();
m_ShaderProgram->enableAttributeArray(0);
GLfloat values[] = {
-1.0, -1.0, +0.0, +0.0,
+1.0, -1.0, +0.0, +0.0,
+0.0, +1.0, +0.0, +0.0,
};
QMatrix4x4 model;
QMatrix4x4 view;
view.lookAt(QVector3D(0.0, 0.0, 10.0), QVector3D(0.0, 0.0, 0.0),
QVector3D(0.0, 1.0, 0.0));
QMatrix4x4 projection;
float aspect = m_ViewportSize.width() / ((m_ViewportSize.height()) ?
m_ViewportSize.height() : 1);
projection.perspective(45.0, aspect, 1.0, 1000.0);
m_MVP = model * view * projection;
m_ShaderProgram->setAttributeArray(0, GL_FLOAT, values, 4);
m_ShaderProgram->setUniformValue("mvp", m_MVP);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
m_ShaderProgram->disableAttributeArray(0);
m_ShaderProgram->release();
}
无论我将相机拉回多远,或重新调整 window 的大小,投影似乎都没有效果,它只是将整个 window 呈现为红色,甚至不接受这个事实我只是告诉它渲染一个有 3 个点的三角形。如下所示。
根据评论进行了以下更改,但现在我看到的只是黑屏。
... // Vertex Shader
gl_Position = mvp * vec4(vertex, 1.0);"
...
... // Data
GLfloat values[] = {
-1.0, -1.0, +0.0,
+1.0, -1.0, +0.0,
+0.0, +1.0, +0.0,
};
...
... // Vertex Attribution Setup
m_ShaderProgram->setAttributeArray(0, GL_FLOAT, values, 3); // Tuple is only 3 tightly packed.
...
根据我对您的模型视图和投影矩阵的观察,如果您将相机定位在 z=1.0,则该三角形位于您的近裁剪平面上。尝试将眼睛位置沿 z 轴向下移动几个单位。理想情况下,您将从 NDC space(身份模型视图和投影矩阵)开始,然后一旦您在屏幕上看到一个三角形,就开始引入相机变换;婴儿步骤 ;) – Andon M. Coleman 3 月 6 日 20:33