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();
}
感谢datenwolf!有一件事我不明白; glFrustum与相机(z = 0)的距离为5(近)至7(远)。但是我的三角形位于z = -6!?我会认为我的三角形应该位于z = 6处,或者是OpenGL负z中的惯例意味着屏幕? – Andy
@Andy:OpenGL的默认约定是深度范围[0 ... 1],GL_GREATER深度排序。 glFrustum将坐标映射为负Z方向为正深度值。实际上,这意味着默认的OpenGL设置会将负Z值映射到屏幕中。因此,glFrustum的近值和远值意味着到负Z方向的距离。 – datenwolf
@datenwolf:不,默认深度测试使用'GL_LESS'。 Z是负面的原因是因为这就是OpenGL的透视矩阵的工作原理。 -Z在镜头前,+ Z在后面。 zNear和zFar是距离(因此总是正数),而不是相机空间值。 –