第20课:蒙板 (参照NeHe)
这次教程中,我们教介绍OpenGL的蒙板技术。到目前为止,我们已经学会如何使用alpha混合,把一个透明物体渲染到屏幕上了,但有时使用它看起来并不是那么的复合我们的心意。使用蒙板技术,将会使图像按照我们设定的蒙板位置精确地绘制。
直到现在,我们在把图像加载到屏幕上时都没有檫除背景色,因为这样简单高效,但是效果并不总是很好。大部分情况下,把纹理混合到屏幕,纹理不是太少就是太多。当我们使用精灵图时,我们不希望背景从精灵的缝隙中透出光来;但在显示文字时,我们又希望文字的间隙可以显示背景色。
基于上述原因,我们需要使用“掩模”。使用“掩膜”需要两个步骤,首先我们在场景上放置黑白相间的纹理,白色代表透明部分,黑色代表不透明部分。接着我们使用一种特殊的混合方式,只有在黑色部分上的纹理才会显示在场景中。
程序运行时效果如下:
下面进入教程:
我们这次将在第06课代码的基础上修改代码,总体上并不会太难,希望大家能理解蒙板技术,这技术真的很好用。首先打开myglwidget.h文件,将类声明更改如下:
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H
#include <QWidget>
#include <QGLWidget>
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:
bool fullscreen; //是否全屏显示
bool m_Masking; //是否使用"<span style="font-size:12px;">掩模</span>"
bool m_Scene; //控制绘制哪一层
GLfloat m_Rot; //控制纹理滚动
QString m_FileName[5]; //图片的路径及文件名
GLuint m_Texture[5]; //储存五个纹理
};
#endif // MYGLWIDGET_H
我们增加了两个布尔变量m_Masking和m_Scene来控制是否开启“
掩模”以及绘制哪一个场景。然后我们增加一个控制图形滚动旋