《OpenGL超级宝典》中第七章TextureRect示例程序,RenderScene()函数解析

这是蓝宝书第七章上面的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需要更新窗口的内容,当场景发生变化时进行重绘
    }

对于里面的内容理解就写到这里,涉及到每一步具体的流程,还需要不断的琢磨。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值