2015-10-04 120 views
0

我想通过一个叫做的图形学习OpenGL和Qt的教程学习OpenGL。我完全按照本教程所做的一切,但我不能渲染我的三角形。这里是我的代码:无法在OpenGL中渲染场景

#include <GL/glew.h> 
#include "GlWindow.h" 

void GlWindow::initializeGL(){ 
    glewInit(); 

    GLfloat verts[] = { 
     0.0f, -1.0f, 
     -1.0f,-1.0f, 
     1.0f, -1.0f 

    }; 

    GLuint myBufferID; 
    glGenBuffers(1, &myBufferID); 
    glBindBuffer(GL_ARRAY_BUFFER, myBufferID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW); 

    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0,2, GL_FLOAT, GL_FALSE, 0,0); 

} 

void GlWindow::paintGL(){ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 
} 

这里是我GLWindow.h代码:

#ifndef GLWINDOW_H 
#define GLWINDOW_H 
#include <QtOpenGL/QGLWidget> 

class GlWindow : public QGLWidget{ 
public: 

protected: 
    void initializeGL(); 
    void paintGL(); 
}; 

#endif // GLWINDOW_H 

而且我的main.cpp

#include <QApplication> 
#include <GlWindow.h> 

int main(int argc, char *argv[]){ 
    QApplication app(argc, argv); 

    GlWindow glWindow; 
    glWindow.show(); 

    return app.exec(); 
} 

但产量仅仅是一个黑色的窗口。如果我也使用glClearColor(1.0f,0.0f,0.0f,1.0f); 我会有一个红色的窗口。但我不知道为什么我的三角形没有显示。

编辑:即时通讯使用Ubuntu的15,当我运行glx info | grep version我得到这个:

server glx version string: 1.4 
client glx version string: 1.4 
GLX version: 1.4 
OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.5.2 
OpenGL core profile shading language version string: 3.30 
OpenGL version string: 3.0 Mesa 10.5.2 
OpenGL shading language version string: 1.30 
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 10.5.2 
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00 
+0

我们在说OpenGL> = 2吗?你的着色器程序在哪里? – peppe

+0

@peppe我认为我的OpenGL版本是OpenGL版本字符串:3.0。我遵循的教程不使用任何着色器。 – MoNo

+0

Qt已经处理OpenGL函数加载。而QGLWidget已弃用。改用QOpenGLWidget。 – Poriferous

回答

1

的问题是顶点坐标:

GLfloat verts[] = { 
     0.0f, -1.0f, 
     -1.0f,-1.0f, 
     1.0f, -1.0f 

更改他们的例子:

GLfloat verts[] = { 
     0.0f, 0.0f, 
     0.0f,-1.0f, 
     -1.0f, -1.0f 

如果另一个代码是c或者你会在左下角看到一个三角形。

+0

我仍然有问题,我改变了坐标,但我仍然有一个黑色的窗口 – MoNo

+0

可能有很多其他问题。根据您使用的OpenGL版本,您必须指定着色器程序并使用顶点数组。此外,以这种方式使用sizeof运算符并不是一个好习惯。相反,特别是在测试中,您应该使用常量。 'glBufferData(GL_ARRAY_BUFFER,sizeof(verts),verts,GL_STATIC_DRAW);''也许你应该开始学习OpenGL 1.1版本,你不必使用着色器程序。 – Michael