多维数据集在QGLWidget中呈现为正方形



我一直在尝试在QGLWidget中呈现一个立方体,但它出现了错误。不管我怎么旋转它,它看起来都像一个平的正方形。就好像它没有注意到顶点的Z坐标。就在我添加GL_DEPTH_BUFFER_BIT的清除之前,这个正方形看起来就像立方体的所有侧面挤在一起。现在它似乎丢弃了不属于正面的顶点,但它仍然不是一个立方体。

截图[链接]

我的initializeGL()和paintGL():

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();
}

顶点和索引应该被正确定义,它们来自教程,就像大多数代码一样。不过,2D对象的渲染似乎还不错。

还有,为什么教程调用矩阵。用-2参数翻译?如果我将其更改为大于1的其他值或删除它,则渲染对象将消失。

Qt5, Windows Vista 32位

还有,为什么教程调用矩阵。用-2平移论点吗?如果我把它改成大于1的值,或者去掉它,渲染对象消失。

这是由于剪辑。当你渲染物体时,"太近"或"太远"的东西会被丢弃,分别通过近裁剪平面和远裁剪平面。

通过移动立方体更近(将-2更改为1或0),您将立方体向前移动,超过近的剪切平面,因此它会消失。

glVertexAttribPointer()有一个size参数,用于指定每个顶点的组件数。在代码中它是2,因此一切都是2D。

相关内容

  • 没有找到相关文章

最新更新