QOpenGLWidget不绘制数组

Posted

技术标签:

【中文标题】QOpenGLWidget不绘制数组【英文标题】:QOpenGLWidget not drawing array 【发布时间】:2015-11-11 08:51:21 【问题描述】:

你是我这个问题的最后手段,因为我没有想法。 所以首先我已经做了一些 openGL 的东西,但没有使用 Qt 库。

而且由于 Qt android 编译器的原因,我必须使用 Qt 库来做这件事,所以我没有办法。

所以我试图像在普通 openGL 中一样绘制一些顶点坐标。 在浮点数组等中保存点。 所以我兴高采烈地做了正确的vao,vbo ..着色器..但它不会画任何东西。 paintGL() 仅在使用 glBegin 和 end 进行硬编码时才会绘制。

请告诉我哪里出了问题,让我摆脱痛苦^^ 啊,是的,已经有类似我的问题Here 但没有答案,所以我想再试一次。

--MainWidget 标题:

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QVector2D>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QVector3D>
#include <QOpenGLVertexArrayObject>


class MainWidget : public QOpenGLWidget, protected QOpenGLFunctions

    Q_OBJECT

public:
     MainWidget(QWidget *parent = 0);
    ~MainWidget();


protected:
    void initializeGL() Q_DECL_OVERRIDE;
    void resizeGL(int w, int h) Q_DECL_OVERRIDE;
    void paintGL() Q_DECL_OVERRIDE;

    GLfloat vertices[9];



private:
    QOpenGLShaderProgram program;
    QOpenGLBuffer arrayBuf;
    QOpenGLVertexArrayObject vertexArrayID;

;

#endif // MAINWIDGET_H

-- MainWidget Cpp:

#include "mainwidget.h"


MainWidget::MainWidget(QWidget *parent): QOpenGLWidget(parent)


MainWidget::~MainWidget()



void MainWidget::initializeGL()
    initializeOpenGLFunctions();
    glClearColor(0, 0, 0.4f, 0);
    glEnable(GL_DEPTH_TEST);
    //glEnable(GL_CULL_FACE);

   static const GLfloat g_vertex_buffer_data[] = 
        -1.0f, -1.0f, 0.0f,
        1.0f, -1.0f, 0.0f,
        0.0f,  1.0f, 0.0f
    ;
    for(int i = 0; i < 9; i++)
        vertices[i] = g_vertex_buffer_data[i];
    

    vertexArrayID.create();
    vertexArrayID.bind();
    program.addShaderFromSourceFile(QOpenGLShader::Vertex, "vertex.vert");
    program.addShaderFromSourceFile(QOpenGLShader::Fragment, "fragment.frag");
    program.link();
    program.bind();
    arrayBuf.create();
    arrayBuf.bind();
    arrayBuf.allocate(&vertices, 9 * sizeof(GLfloat));
   /* glGenBuffers(1, &arrayBuf);
    glBindBuffer(GL_ARRAY_BUFFER, arrayBuf);*/
    glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);



void MainWidget::resizeGL(int w, int h)



void MainWidget::paintGL()
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    arrayBuf.bind();
    arrayBuf.allocate(&vertices, 9*sizeof(GLfloat));



    int vertexLocation = program.attributeLocation("vertex");
    program.enableAttributeArray("vertexLocation");
    program.setAttributeBuffer(vertexLocation, GL_FLOAT, 0, 3, sizeof(GLfloat) );

    //glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);


--主Cpp:

#include <QApplication>
#include <QLabel>
#include <QSurfaceFormat>

#ifndef QT_NO_OPENGL
#include "mainwidget.h"
#endif

int main(int argc, char *argv[])

    QApplication app(argc, argv);

    QSurfaceFormat format;
    format.setDepthBufferSize(24);
    QSurfaceFormat::setDefaultFormat(format);

    app.setApplicationName("GLtest");

#ifndef QT_NO_OPENGL
    MainWidget widget;
    widget.show();
#else
    QLabel note("OpenGL Support required");
    note.show();
#endif
    return app.exec();

--顶点着色器尽可能简单:

    #version 330

layout(location = 0) in vec3 vertex;

void main()
    gl_Position = vec4(vertex, 1.0);

--片段着色器:

#version 330
out vec3 color;
void main()
    color = vec3(1,0,0);

在此先感谢.. 欢迎任何形式的帮助! 干杯

【问题讨论】:

【参考方案1】:

您启用了错误的顶点属性:

program.enableAttributeArray("vertexLocation");

应该是(不是缺少的“)

program.enableAttributeArray(vertexLocation);

或(正确的名称)

program.enableAttributeArray("vertex");

【讨论】:

圣母...非常感谢!现在我觉得问起来很愚蠢 Np,如果这解决了您的问题,您可以接受答案:)

以上是关于QOpenGLWidget不绘制数组的主要内容,如果未能解决你的问题,请参考以下文章

Qt音视频开发24-视频显示QOpenGLWidget方式(占用GPU)

在QOpenGLWidget上使用Qt5小部件而不重写?

QOpenGLWidget 绘制对象

QOpenGLWidget,QOpenGLWindow的问题

加不了openglwidget

在qt的QOpenGLWidget开启opengl的抗锯齿