2012-10-28 30 views
2

我想用OpenGL和Qt显示一个三角形,但只能得到一个黑色的窗口。 我在做什么错?用Qt和OpenGL显示一个三角形

glwidget.h:

#pragma once 
#include <QGLWidget> 

class GLWidget : public QGLWidget { 
public: 
    GLWidget(QWidget *parent = 0); 
    ~GLWidget(); 
    QSize sizeHint() const { return QSize(400, 400); } 

protected: 
    void initializeGL(); 
    void paintGL(); 
    void resizeGL(int width, int height); 
}; 

glwidget.cpp:

#include "glwidget.h" 

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

GLWidget::~GLWidget(){ } 

void GLWidget::initializeGL() { } 

void GLWidget::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(-1.5f,0.0f,-6.0f); 

    glBegin(GL_TRIANGLES); 
    glVertex3f(0.0f, 1.0f, 0.0f); 
    glVertex3f(-1.0f,-1.0f, 0.0f); 
    glVertex3f(1.0f,-1.0f, 0.0f); 
    glEnd(); 
} 

void GLWidget::resizeGL(int w, int h) 
{ 
    QGLWidget::resize(w,h); 
} 

main.cpp中:

#include <QApplication> 
#include "glwidget.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    GLWidget glWidget; 
    glWidget.show(); 
    return app.exec(); 
} 

回答

5

您必须在paintGL的开头设置视口和投影成员函数。把它放在你的paintGL的开头:

QSize viewport_size = size(); 
glViewport(0, 0, viewport_size.width(), viewport_size.height()); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glFrustum(-1, 1, -1, 1, 5, 7); // near and far match your triangle Z distance 

glMatrixMode(GL_MODELVIEW); 

另外,如果窗口是双缓冲的,缓冲区必须在绘制后交换。无论是在构造函数中设置

setAutoBufferSwap(true); 

,paintGL返回后替换,或者在paintGL的末尾添加

swapBuffers(); 

+0

感谢datenwolf!有一件事我不明白; glFrustum与相机(z = 0)的距离为5(近)至7(远)。但是我的三角形位于z = -6!?我会认为我的三角形应该位于z = 6处,或者是OpenGL负z中的惯例意味着屏幕? – Andy

+0

@Andy:OpenGL的默认约定是深度范围[0 ... 1],GL_GREATER深度排序。 glFrustum将坐标映射为负Z方向为正深度值。实际上,这意味着默认的OpenGL设置会将负Z值映射到屏幕中。因此,glFrustum的近值和远值意味着到负Z方向的距离。 – datenwolf

+0

@datenwolf:不,默认深度测试使用'GL_LESS'。 Z是负面的原因是因为这就是OpenGL的透视矩阵的工作原理。 -Z在镜头前,+ Z在后面。 zNear和zFar是距离(因此总是正数),而不是相机空间值。 –

-1

三角变换了形式

glTranslatef(-0.5f,0.0f, 0.0f); 

glColor3f(1.0f, 0.0f, 0.0f); 
glBegin(GL_TRIANGLES); 
glVertex3f(0.0f, 0.2f, 0.0f); 
glVertex3f(-0.2f,-0.2f, 0.0f); 
glVertex3f(0.2f,-0.2f, 0.0f); 
glEnd();