【发布时间】:2015-05-07 02:17:05
【问题描述】:
所以我正在尝试使用 Qt 为我的游戏实现一个编辑器,但我似乎无法理解 QOpenGLWidget 是如何工作的。现在,我只想得到一个简单的三角形来渲染,然后我可以担心移动我所有的其他东西。
现在,它将打开窗口,并且在 QOpenGLWidget 中,将清除我在子类中设置的自定义颜色(所以我确实推广了它),但它不会绘制下面类中描述的三角形.我已经尝试遵循 Qt OpenGLWindow 示例以及 QOpenGLWidget 和 QOpenGLShaderProgram 中的示例,我还检查了每个返回 bool 的函数以确保它们都被正确执行,它们是,但仍然没有三角形。
我错过了一个重要的函数调用吗?我是否以绝对错误的方式做事?还是 Qt 有一些非常微妙和奇怪的东西?
这是标题:
#include<qopenglwidget.h>
#include<QtGui/qopenglfunctions.h>
class EditorViewWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
public:
EditorViewWidget(QWidget *parent);
protected:
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
QOpenGLShaderProgram* shaderProgram;
QOpenGLVertexArrayObject vao;
QOpenGLBuffer VBO;
int position_attribute;
int color_uniform;
float Vertices[9];
const char* vert="#version 150 \n"
" \n"
" in vec3 position; \n"
" \n"
" void main() \n"
" { \n"
" gl_Position = vec4(position, 1.0); \n"
" }";
const char* frag="#version 150 \n"
" \n"
" uniform vec3 Color; \n"
" out vec4 outColor; \n"
" \n"
" void main() \n"
" { \n"
" outColor = vec4(Color, 1.0); \n"
" }";
};
来源:
EditorViewWidget::EditorViewWidget(QWidget* parent)
:QOpenGLWidget(parent)
{
float v[] = {
0.0, 0.5, 0.0,
0.5, -0.5, 0.0,
-0.5, -0.5, 0.0
};
for (int i = 0; i < 9; i++)
Vertices[i] = v[i];
}
void EditorViewWidget::initializeGL()
{
initializeOpenGLFunctions();
vao.create();
vao.bind();
//glGenBuffers(1, &VBO);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
shaderProgram = new QOpenGLShaderProgram(this);
shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vert);
shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, frag);
shaderProgram->link();
shaderProgram->bind();
position_attribute = shaderProgram->attributeLocation("position");
color_uniform = shaderProgram->uniformLocation("Color");
VBO.create();
VBO.bind();
VBO.allocate(&Vertices, 9*sizeof(float));
shaderProgram->enableAttributeArray(position_attribute);
shaderProgram->setAttributeArray(position_attribute, Vertices, 3);
shaderProgram->setUniformValue(color_uniform, 1.0f, 1.0f, 1.0f);
//glVertexAttribPointer(position_attribute, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
}
void EditorViewWidget::resizeGL(int w, int h)
{
}
void EditorViewWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
VBO.bind();
VBO.allocate(&Vertices, 9 * sizeof(float));
shaderProgram->enableAttributeArray(position_attribute);
shaderProgram->setAttributeArray(position_attribute, Vertices, 3, 0);
shaderProgram->setUniformValue(color_uniform, 1.0f, 1.0f, 1.0f);
glDrawArrays(GL_TRIANGLES, 0, 3);
shaderProgram->disableAttributeArray(position_attribute);
}
【问题讨论】:
-
提示:仔细查看用于将顶点数据从
v复制到Vertices的for循环。 -
......真的吗?......好吧,修正了这个愚蠢的错误,但它仍然不起作用。在我有一个 for 循环之前,我使用的是 std::copy,但我切换只是因为这似乎更易于调试。