学习QT opengl 上色

环境

qt creator 5.6

代码

pro

#-------------------------------------------------
#
# Project created by QtCreator 2018-06-08T08:01:36
#
#-------------------------------------------------

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = myopengl
TEMPLATE = app
LIBS += -lopengl32 -lglu32


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtOpenGL/QtOpenGL>

namespace Ui {
class Widget;
}

class Widget : public QGLWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

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

private:
    void initWidget();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <GL/glu.h>

Widget::Widget(QWidget *parent) :
    QGLWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    initWidget();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::initializeGL()
{
    glShadeModel( GL_SMOOTH );//启用阴影平滑
    glClearColor(0.0,0.0,0.0,0.0);//设置清除屏幕时所用的颜色
    glClearDepth(1.0);//设置深度缓存
    glEnable(GL_DEPTH_TEST);//启用深度测试
    glDepthFunc(GL_LEQUAL);//所作深度测试类型
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//精细的透视修正
}

void Widget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除屏幕和深度缓存
    glLoadIdentity();//重置当前的模型观察矩阵

    glTranslatef( -1.5,  0.0, -6.0 );//glTranslatef(x, y, z)沿着 X, Y 和 Z 轴移动
    glBegin(GL_TRIANGLES);//开始绘制三角形
    glColor3f(1.0,0.0,0.0);
    glVertex3f(0.0,1.0,0.0);//上顶点
    glColor3f(0.0,1.0,0.0);
    glVertex3f(-1.0,-1.0,0.0);//左下顶点
    glColor3f(0.0,0.0,1.0);
    glVertex3f(1.0,-1.0,0.0);//右下顶点
    glEnd();//三角形绘制结束

    glTranslatef(3.0,0.0,0.0);//向右移动三个单位,在屏幕右边绘制正方形
    glBegin(GL_QUADS);//开始绘制四边形
    glColor3f(0.5,0.5,1.0);//设置成蓝色
    glVertex3f(-1.0,1.0,0.0);//左上顶点
    glVertex3f(1.0,1.0,0.0);//右上顶点
    glVertex3f(1.0,-1.0,0.0);//右下顶点
    glVertex3f(-1.0,-1.0,0.0);//左下顶点
    glEnd();//四边形绘制结束

}

void Widget::resizeGL(int width, int height)
{
    if(height == 0)
    {
        height = 1;
    }

    glViewport(0,0,(GLint)width,(GLint)height);//重置当前的视口
    glMatrixMode(GL_PROJECTION);//选择投影矩阵
    glLoadIdentity();//重置投影矩阵
    gluPerspective(45.0,(GLfloat)width/(GLfloat)height,0.1,100.0);//建立透视投影矩阵
    glMatrixMode(GL_MODELVIEW);//选择模型观察矩阵
    glLoadIdentity();//充值模型观察矩阵
}

void Widget::initWidget()
{
    setGeometry( 200, 200, 640, 480 );//初始化窗口位置和大小
}

运行结果

这里写图片描述

文章参考:http://qiliang.net/old/nehe_qt/lesson03.html

猜你喜欢

转载自blog.csdn.net/sinat_33859977/article/details/80697843