第26课:剪裁平面,蒙板缓存和反射 (参照NeHe)
这次教程中,我们将学会如何创建镜面显示效果,它利用到剪裁平面,蒙板缓存等OpenGL中一些高级的技巧。在这课里,我们将创建真正的反射,基于物理的,相信你一定很期待!
程序运行时效果如下:
下面进入教程:
我们这次将在第07课的基础上修改代码(有不少重复的地方),我会对新增部分一一解释。首先打开myglwidget.h文件,将类声明更改如下:
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QWidget>
#include <QGLWidget>
class GLUquadric;
class MyGLWidget : public QGLWidget
{
Q_OBJECT
public:
explicit MyGLWidget(QWidget *parent = 0);
~MyGLWidget();
protected:
//对3个纯虚函数的重定义
void initializeGL();
void resizeGL(int w, int h);
void paintGL();
void keyPressEvent(QKeyEvent *event); //处理键盘按下事件
private:
void drawObject(); //绘制球体
void drawFloor(); //绘制地面
private:
bool fullscreen; //是否全屏显示
QString m_FileName[3]; //图片的路径及文件名
GLuint m_Texture[3]; //储存一个纹理
GLfloat m_xRot; //x旋转角度
GLfloat m_yRot; //y旋转角度
GLfloat m_xSpeed; //x旋转速度
GLfloat m_ySpeed; //y旋转速度
GLfloat m_Deep; //深入屏幕的距离
GLfloat m_Height; //球离开地面的高度
GLUquadric *m_Quadratic; //二次几何体
};
#endif // MYGLWIDGET_H
首先我们看到m_FileName和m_Texture变成长度为3的数组,因为我们会使用三张图片来加载三个不同的纹理。接着我们增加了GLfloat变量m_Height来表示球体离开地面的高度,GLUquadric指针m_Quadratic来指向一个二次几何体对象(
当然我们应该在类前面增加GLUquadric的声明)。最后,我们增加了两个函数声明drawObject()和drawFloor(),依次用来绘制球体和地面。
接下来,我们需要打开myglwidget.cpp,在构造函数中初始化新增变量,并修改析构函数,很简单不多解释,具体代码如下:
MyGLWidget::MyGLWidget(QWidget *parent) :
QGLWidget(parent)
{
fullscreen = false;
m_FileName[0] = "D:/QtOpenGL/QtImage/Envwall.bmp"; //应根据实际存放图片的路径进行修改
m_FileName[1] = "D:/QtOpenGL/QtImage/Ball.