这是蓝宝书第七章上面的TextureRect示例的部分源代码,刚开始阅读时候存在很多疑惑,慢慢的结合前面的知识,逐渐的知道这些代码的原理,对其中的部分代码做一些注解仅供理解参考,这里只对RenderScene(),场景渲染函数进行注解:
void RenderScene(void)
{
//基于时间的旋转动画
static CStopWatchrotTimer; //声明并创建CStopWatch类型的静态局部变量
float yRot = rotTimer.GetElapsedSeconds() * 60.0f; // 获取时间间隔并乘以系数,用于控制旋转速度,使速度得到平滑处理
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓冲区和深度缓冲区的存储数据
modelViewMatrix.PushMatrix();//保存当前模型视图矩阵(单位矩阵)
M3DMatrix44f mCamera; //创建相机矩阵
cameraFrame.GetCameraMatrix(mCamera); //调用角色帧GLFrame的函数,获取合适的照相机矩阵
modelViewMatrix.MultMatrix(mCamera); //等价于modelViewMatrix.PushMatrix(mCamera),目的是将模型视图矩阵乘以相机矩阵,
modelViewMatrix.PushMatrix(); //并进行保存
//绘制倒影
modelViewMatrix.Scale(1.0f, -1.0f, 1.0f); // 对Y轴进行翻转,目的为了绘制下面的倒影
modelViewMatrix.Translate(0.0f, 0.8f, 0.0f); // 沿着Y轴进行平移一定的距离
glFrontFace(GL_CW); //窗口坐标上投影多边形的顶点顺序为顺时针方向的表面为正面(翻转之后,原先的正面变成了顺
// 时针了,所以要改变顶点环绕模式:顺时针为正面)
DrawSongAndDance(yRot); //调用函数绘制倒影的图形
glFrontFace(GL_CCW); //绘制完倒影,恢复设置多边形的顶点顺序为逆时针方向的表面为正面。
modelViewMatrix.PopMatrix(); //恢复压栈之前的状态矩阵
// 绘制地面
glEnable(GL_BLEND); //开启颜色混合模式
glBindTexture(GL_TEXTURE_2D, uiTextures[0]); //绑定纹理对象
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //设置颜色混合方程,具体可参考第五版蓝皮书P82
static GLfloat vFloorColor[] = { 1.0f, 1.0f, 1.0f, 0.75f}; //设置地面的颜色,静态局部变量的生存周期直到程序终止
shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE,
transformPipeline.GetModelViewProjectionMatrix(),
vFloorColor,
0); //将变换矩阵和颜色数据传递到纹理存储着色器,具体参考P64
floorBatch.Draw(); //将创建的地面图形提交到着色器
glDisable(GL_BLEND); //关闭颜色混合模式
DrawSongAndDance(yRot); //调用函数,绘制场景几何图形
modelViewMatrix.PopMatrix(); //恢复模型视图单位矩阵
// 绘制上层的图形
// Creating this matrix really doesn't need to be done every frame. I'll leave it here
// so all the pertenant code is together
M3DMatrix44f mScreenSpace;
m3dMakeOrthographicMatrix(mScreenSpace, 0.0f, 800.0f, 0.0f, 600.0f, -1.0f, 1.0f); //创建正投影矩阵
// Turn blending on, and depth testing off
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST); //开启颜色混合模式,并且关闭深度测试
glUseProgram(rectReplaceShader); //使用自己创建的着色器,关于这一部分可以参考蓝宝书的相关内容
glUniform1i(locRectTexture, 0);
glUniformMatrix4fv(locRectMVP, 1, GL_FALSE, mScreenSpace);
glBindTexture(GL_TEXTURE_RECTANGLE, uiTextures[3]);
logoBatch.Draw();
// Restore no blending and depth test
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST); //关闭颜色混合模式,开启深度测试
// Do the buffer Swap
glutSwapBuffers(); //将后台缓冲区的内容交换到前台
// Do it again
glutPostRedisplay(); //告诉GLUT需要更新窗口的内容,当场景发生变化时进行重绘
}
对于里面的内容理解就写到这里,涉及到每一步具体的流程,还需要不断的琢磨。