LINUX环境下QT5.9+OPENGL绘制图形与渲染入门(二)

如果你想要深层次的搞明白OpenGL的技术原理,请到B站看各种大佬的详细讲解,
再此只说明我自己的理解。
可以认为OpenGL是将一个图形分解成N多个小方块,也就是微分几何,之所以微分是因为GPU精于数据计算,微分之后几何图形就变成可以计算的数据了,即每个小方块的位置数据;然后再进行积分将N多个小方块组合在一起,就集合形成了一个几何图形。

 

 

1.修改.pro文件
QT += opengl
LIBS += -lGLU //重点注意缺少该文件,将导致 #include <GL/glu.h>无法导入,进而导致gluPerspective()函数无法使用

2.修改.h文件,请看图

 

3.编写.cpp文件
#include “nehewidget.h”

NeheWidget::NeheWidget(QWidget *parent, bool fs)
:QGLWidget(parent)
{
fullScreen = fs;
}

void NeheWidget::initializeGL()
{
glShadeModel(GL_SMOOTH);
// glShadeModel(GL_FLAT);
glClearColor(0.f, 0.f, 0.f, 0.f);
glEnable(GL_DEPTH_TEST);
}

void NeheWidget::resizeGL(int w, int h)
{
glViewport(0, 0, (GLint)w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 0.1f, 100.f);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

void NeheWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
drawTriangle();
drawSquare();

}

void NeheWidget::drawTriangle()
{
glLoadIdentity();
glTranslatef(-1.5f, 0.f, -6.f);

glBegin(GL_TRIANGLES);
    glColor3f(1.f, 0.f, 0.f);
    glVertex3f(0.f, 1.f, 0.f);
    glColor3f(0.f, 1.f, 0.f);
    glVertex3f(1.f, -1.f, 0.f);
    glColor3f(0.f, 0.f, 1.f);
    glVertex3f(-1.f, -1.f, 0.f);
    glEnd();

}

void NeheWidget::drawSquare()
{
glLoadIdentity();
glTranslatef(1.5, 0.0, -6.f);

// 会为蓝色,因为在paintGL()中,先调用了drawTriangle(), 最后一个顶点用的深蓝色,之后为做改动,
// 所以,这里仍为蓝色.
glBegin( GL_QUADS );
    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();

}

本篇博客重点在于入门QT+OpenGL,基本图形绘制,避免刚入门同学走许多不必要的大坑,代码全部公开,仅供参考,如有错误请指正。

 

 

 

posted @ 2023-08-24 13:28  铁木2023  阅读(150)  评论(0编辑  收藏  举报