【问题标题】:A cube is rendered as a square in QGLWidget立方体在 QGLWidget 中呈现为正方形
【发布时间】:2013-03-08 22:57:12
【问题描述】:

我一直试图在 QGLWidget 中渲染一个立方体,但结果是错误的。无论我如何旋转它,它看起来都是一个扁平的正方形。就好像它没有注意到它的顶点的 Z 坐标一样。就在我添加清除 GL_DEPTH_BUFFER_BIT 之前,正方形看起来就像立方体的所有侧面都挤成一个。现在它似乎丢弃了不属于正面的顶点,但它仍然不是立方体。!

Screenshots [link]

我的 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 对象的渲染似乎还不错。

另外,为什么教程调用 matrix.translate 时带有 -2 参数?如果我将其更改为大于 1 的任何其他值或将其删除,渲染的对象就会消失。

Qt5,Windows Vista 32 位。

【问题讨论】:

    标签: c++ qt opengl qt5 qglwidget


    【解决方案1】:

    另外,为什么教程用 -2 调用 matrix.translate 争论?如果我将其更改为大于 1 的任何其他值或将其删除, 渲染的对象消失了。

    这是由于剪辑造成的。当您渲染对象时,“太近”或“太远”的东西会被丢弃,通过近和远裁剪平面(分别)。

    通过将立方体移动得更近(将 -2 更改为 1 或 0),您可以将立方体向前移动,越过近剪裁平面,然后它就会消失。

    【讨论】:

    • 谢谢,没想到。
    【解决方案2】:

    glVertexAttribPointer() 有一个size 参数,它指定每个顶点的组件数。在代码中它是 2,因此一切都是 2D。改为 3 即可解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多