2015-01-19 2 views
-1
#ifndef GLWIDGET_H 
#define GLWIDGET_H 

#include <QOpenGLWidget> 
#include <QOpenGLFunctions> 
#include <QOpenGLShaderProgram> 
#include <QOpenGLVertexArrayObject> 
#include <QOpenGLBuffer> 
#include <QMatrix4x4> 
class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions 
{ 
public: 
    GLWidget(QWidget *parent=0); 
    ~GLWidget(); 
protected: 
    virtual void initializeGL() Q_DECL_OVERRIDE; 
    virtual void paintGL() Q_DECL_OVERRIDE; 
    virtual void resizeGL(int w, int h) Q_DECL_OVERRIDE; 
    GLuint compileShaders(); 
private: 
    QOpenGLShaderProgram *program; 
    QOpenGLVertexArrayObject vao; 
    QOpenGLBuffer vbo; 
    static const char *vshader_source; 
    static const char *fshader_source; 
}; 


#endif // GLWIDGET_H 

#include "glwidget.h" 
#include <assert.h> 
#include <QDebug> 
#include <QGLFormat> 

GLWidget::GLWidget(QWidget *parent) : 
    QOpenGLWidget(parent) 
{ 
} 

GLWidget::~GLWidget() 
{ 

} 

void GLWidget::initializeGL() 
{ 
    initializeOpenGLFunctions(); 
    GLfloat color[] = {0.0, 0.0, 0.0, 1.0}; 
    GLfloat points[] = {1.0,0.0,0.0,1.0, 
         0.0,1.0,0.0,1.0, 
         1.0,1.0,0.0,1.0}; 
    glClearBufferfv(GL_COLOR, 0, color); 

    program = new QOpenGLShaderProgram(); 
    program->addShaderFromSourceCode(QOpenGLShader::Vertex, vshader_source); 
    program->addShaderFromSourceCode(QOpenGLShader::Fragment, fshader_source); 
    program->bindAttributeLocation("vertex", 0); 
    program->link(); 
    assert(program->bind()); 

    vao.create(); 
    //vao.bind(); 
    QOpenGLVertexArrayObject::Binder vaoBinder(&vao); 
    vbo.create(); 
    vbo.bind(); 
    vbo.allocate(points, sizeof(points)); 

    vbo.bind(); 
    QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); 
    f->glEnableVertexAttribArray(0); 
    f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    vbo.release(); 

    program->release(); 
} 

void GLWidget::paintGL() 
{ 
    QOpenGLVertexArrayObject::Binder vaoBinder(&vao); 
    program->bind(); 
    glDrawArrays(GL_TRIANGLES, 0, 3); 
    program->release(); 
} 

void GLWidget::resizeGL(int w, int h) 
{ 

} 

//GLuint GLWidget::compileShaders() 
//{ 
// GLint status; 
// GLchar log[1024]; 
// vshader = glCreateShader(GL_VERTEX_SHADER); 
// glShaderSource(vshader, 1, vshader_source, NULL); 
// glCompileShader(vshader); 
// glGetShaderiv(vshader, GL_COMPILE_STATUS, &status); 
// glGetShaderInfoLog(vshader, 1024, NULL, log); 
// qDebug()<<log; 
// assert(status == GL_TRUE); 

// fshader = glCreateShader(GL_FRAGMENT_SHADER); 
// glShaderSource(fshader, 1, fshader_source, NULL); 
// glCompileShader(fshader); 
// glGetShaderiv(fshader, GL_COMPILE_STATUS, &status); 
// glGetShaderInfoLog(fshader, 1024, NULL, log); 
// qDebug()<<log; 
// assert(status == GL_TRUE); 

// GLuint program = glCreateProgram(); 
// glAttachShader(program, vshader); 
// glAttachShader(program, fshader); 
// glLinkProgram(program); 
// glGetProgramiv(program, GL_LINK_STATUS, &status); 
// assert(status == GL_TRUE); 

// glDeleteShader(vshader); 
// glDeleteShader(fshader); 

// return program; 
//} 


const char *GLWidget::vshader_source = 
    "attribute vec4 vertex;\n" 
    "void main(){\n" 
    "gl_Position = gl_Vertex;\n" 
    "}\n"; 

const char *GLWidget::fshader_source = 
    "void main(){        \n" 
    "gl_FragColor = vec4(0.0, 0.8, 1.0, 1.0); \n" 
    "}          \n"; 

이것은 내 Qt 코드입니다. 셰이더와 다른 코드를 변경하려고 여러 번 시도했지만 모든 코드가 실패하고 이미지가 없습니다. 나는 아무 것도 모른다, 나에게 도움이 되는가? 그리고 나중에이 문제를 만났을 때 오류가보고되지 않고 Qt5에서 OpenGL 프로그램에 대한 정보가 거의 없기 때문에이 프로그램이 작동하지 않는 이유를 어떻게 찾을 수 있습니까?I Qt 5의 OpenGL 프로그램에는 이미지가 없습니다.

좋아,이 코드의 오류를 발견했는지 " F-> glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, 0); ". 3이 4로 변경되어야합니다. 하지만 여전히 qt5에서 OpenGL을 배우는 법을 알고 싶습니다.

답변

0

좋아, 나는 이것이 일반적인 정점 당 구성 요소의 수를 pecifies 때문에

// ... 
vbo.bind(); 
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions(); 
f->glEnableVertexAttribArray(0); 
f->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
vbo.release();. 
// ... 

void glVertexAttribPointer(GLuint index, 
GLint size, 
GLenum type, 
GLboolean normalized, 
GLsizei stride, 
const GLvoid * pointer); 

3 glVertexAttribPointer 방법은 4

로 변경해야한다는 것입니다 코드에서 오류를 발견했다 속성. 1, 2, 3, 4 여야합니다. 또한 glvertexAttribPointer는 GL_BGRA라는 기호 상수를 허용합니다. 초기 값은 4입니다.