gpt4 book ai didi

c++ - 立方体在 QGLWidget 中呈现为正方形

转载 作者:行者123 更新时间:2023-11-27 23:17:55 27 4
gpt4 key购买 nike

我一直在尝试在 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();
}

顶点和索引应该正确定义,它们取自教程,大部分代码也是如此。不过,二维对象的渲染似乎还不错。

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

Qt5,Windows Vista 32 位。

最佳答案

Also, why does the tutorial call matrix.translate with the -2 argument? If I change it to anything else greater than 1 or remove it, the rendered object disappears.

这是由于裁剪。当您渲染对象时,“太近”或“太远”的事物将通过近和远裁剪平面(分别)被丢弃。

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

关于c++ - 立方体在 QGLWidget 中呈现为正方形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15291329/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com