QOpenGLWidget不会绘制三角形

时间:2015-05-07 02:17:05

标签: c++ qt opengl

所以我正在尝试使用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);
}

2 个答案:

答案 0 :(得分:0)

您以顺时针顺序指定了三角形的顶点。 OpenGL默认情况下是逆时针方向。切换第二个和第三个顶点,你应该看到你的三角形

答案 1 :(得分:0)

每次调用paintGL时,都在分配和设置VBO的属性。 VBO是这样的,你可以只初始化它们,然后多次使用它们。然后你可以在你的paintGL中绑定你的VAO,调用glDrawArrays然后取消绑定你的VAO。此外,解除/释放VBO和VAO应该在glDrawArrays之后和首次设置属性数据之后完成。如果您只使用一个VBO,则不需要VAO。 VAO的唯一目的是持有多个维也纳国际组织。

您正在调用enableAttributeArray而不是setAttributeBuffer。

我不确定上面哪一项导致你的三角形不能正确绘制,但我几乎可以肯定它是其中之一:)。