Куб отображается как квадрат в 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-объекта, кажется, просто отлично.

Кроме того, почему учебник вызывает matrix.translate с аргументом -2? Если я изменю его на что-то большее, чем 1, или уберу его, визуализированный объект исчезнет.

Qt5, Windows Vista 32-битная.

0

Решение

Кроме того, почему учебник вызывает matrix.translate с -2
аргумент? Если я изменю его на что-то большее, чем 1, или уберу его,
визуализированный объект исчезает.

Это связано с отсечением. Когда вы визуализируете объекты, вещи, которые «слишком близко» или «слишком далеко», отбрасываются через ближнюю и дальнюю плоскости отсечения (соответственно).

Перемещая куб ближе (изменяя -2 на 1 или 0), вы продвигаете куб вперед, мимо ближней плоскости отсечения, и, следовательно, он исчезает.

2

Другие решения

glVertexAttribPointer() имеет size параметр, который указывает количество компонентов на вершину. В коде это 2, поэтому все 2D. Изменение на 3 решает проблему.

2

По вопросам рекламы [email protected]