C++ 立方体在QGLWidget中呈现为正方形
我一直在尝试在QGLWidget中渲染立方体,但结果是错误的。不管我怎么旋转它,它看起来就像一个扁平的正方形。就像它没有注意到顶点的Z坐标一样。就在我添加GL_DEPTH_BUFFER_位的清除之前,正方形看起来像是立方体的所有边都塞进了一块。现在它似乎丢弃了不属于正面的顶点,但它仍然不是立方体 我的初始值egl()和paintGL(): 顶点和索引应该正确定义,它们来自教程,大部分代码也是如此。不过,2D对象的渲染似乎还不错 另外,为什么教程使用-2参数调用matrix.translate?如果将其更改为大于1的任何其他值或将其删除,则渲染对象将消失 Qt5,Windows Vista 32位 另外,为什么教程使用-2调用matrix.translate 论点如果我将其更改为任何大于1的值或将其删除, 渲染对象将消失 这是由于剪辑。渲染对象时,将通过近剪裁平面和远剪裁平面(分别)丢弃“太近”或“太远”的对象 通过将立方体移动得更近(将-2更改为1或0),您将使立方体向前移动,经过近剪裁平面,因此它将消失 另外,为什么教程使用-2调用matrix.translate 论点如果我将其更改为任何大于1的值或将其删除, 渲染对象将消失 这是由于剪辑。渲染对象时,将通过近剪裁平面和远剪裁平面(分别)丢弃“太近”或“太远”的对象C++ 立方体在QGLWidget中呈现为正方形,c++,qt,opengl,qt5,qglwidget,C++,Qt,Opengl,Qt5,Qglwidget,我一直在尝试在QGLWidget中渲染立方体,但结果是错误的。不管我怎么旋转它,它看起来就像一个扁平的正方形。就像它没有注意到顶点的Z坐标一样。就在我添加GL_DEPTH_BUFFER_位的清除之前,正方形看起来像是立方体的所有边都塞进了一块。现在它似乎丢弃了不属于正面的顶点,但它仍然不是立方体 我的初始值egl()和paintGL(): 顶点和索引应该正确定义,它们来自教程,大部分代码也是如此。不过,2D对象的渲染似乎还不错 另外,为什么教程使用-2参数调用matrix.translate?
通过将立方体移动得更近(将-2更改为1或0),可以使立方体向前移动,经过近剪裁平面,因此立方体将消失。
glvertexattributepointer()
具有一个大小
参数,该参数指定每个顶点的组件数。在代码中,它是2,因此一切都是2D。更改为3可以解决此问题。glvertexattributepointer()
有一个size
参数,用于指定每个顶点的组件数。在代码中,它是2,因此一切都是2D。更改为3解决了问题。谢谢,我没有想到。谢谢,我没有想到。
typedef struct
{
float XYZW[4];
float RGBA[4];
} Vertex;
Vertex Vertices[8] =
{
//vertices
};
const GLubyte Indices[36] =
{
//indices
};
void ModelView::initializeGL()
{
m_program = new QGLShaderProgram(this);
m_program->addShaderFromSourceCode(QGLShader::Vertex, vertexShaderSource);
m_program->addShaderFromSourceCode(QGLShader::Fragment, fragmentShaderSource);
m_program->link();
}
void ModelView::paintGL()
{
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glClearColor(.5f, .5f, .5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, width(), height());
m_program->bind();
QMatrix4x4 matrix;
matrix.perspective(60, 4.0/3.0, 0.1, 100.0);
matrix.translate(0, 0, -2);
matrix.rotate(50.0, 1, 1, 1);
m_program->setUniformValue(m_matrixUniform, matrix);
m_posAttr = m_program->attributeLocation("posAttr");
m_colAttr = m_program->attributeLocation("colAttr");
m_matrixUniform = m_program->uniformLocation("matrix");
glGenBuffers(1, &BufferId);
glGenBuffers(1, &IndexBufferId);
glBindBuffer(GL_ARRAY_BUFFER, BufferId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferId);
glBufferData(GL_ARRAY_BUFFER, BufferSize, Vertices, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW);
glVertexAttribPointer(m_posAttr, 2, GL_FLOAT, GL_FALSE, VertexSize, 0);
glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, VertexSize, (GLvoid *)RgbOffset);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, NULL);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
m_program->release();
}