码迷,mamicode.com
首页 > 其他好文 > 详细

《OpenGL游戏编程》第9章-PlanarShadow关键代码注释

时间:2014-12-05 23:53:10      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   color   os   sp   for   div   log   

阴影这块确实是难点。说到阴影就必须提到投影矩阵、模板值为1和2时分别渲染。说来话长,仅仅放上代码,供日后查阅。

 1 /** 渲染墙面和阴影 */
 2 void  CPlanarShadow::Render()
 3 {
 4   glClear(GL_STENCIL_BUFFER_BIT);                /**< 清除模版缓存 */
 5   glEnable(GL_STENCIL_TEST);                     /**< 启用模版测试 */
 6 
 7   /** 循环处理每个墙面 */
 8   for(int i = 0; i < (int)walls.size(); i++)
 9   {
10     glStencilFunc(GL_ALWAYS, 1, 1);           /**< 规定了模板测试的一种约定:RenderWall方法里所渲染的图形的模版值为1*/
11     glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);      
12 
13     /** 绘制当前墙面 */
14     glDisable(GL_LIGHT0);             
15     RenderWall(walls[i]);                 /**< 渲染墙i,涉及到的像素对应的模板值为1*/
16     glEnable(GL_LIGHT0);              
17 
18     glDisable(GL_DEPTH_TEST);             /**< 关闭深度测试,忽略深度测试,模板测试如果通过(代码行376)就算通过*/
19     
20     glStencilFunc(GL_EQUAL, 1, 1);               /**< 规定了模板测试的一种约定,这里ref和mask都等于1,就被认为是通过模板测试,绘制模版值为1的象素 */
21     glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);      /**< stencil test and the depth test pass,模版缓冲区的值加1 */
22 
23     glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);/**< 禁止颜色缓存写,就是为了储存模板缓冲区的值 */
24     /** 开始投射阴影 根据模板测试的约定,PushMatrix里的涉及的顶点的模板值都要进行一次加1操作*/
25     glPushMatrix(); 
26       /** 创建投射矩阵 */
27       float m[16] = {0};                
28       CreateShadowMatrix(m, walls[i].vVerts[0], walls[i].vNormal, lightPos);/**< 计算当前墙面i的投影矩阵m*/
29       glMultMatrixf(m); //投影矩阵与当前矩阵的一次叠加
30 
31 /** 这次是在新的矩阵空间中进行绘制物体,可以得到所谓的"阴影",这个阴影就是一个茶壶对象,实际上是RenderObjects方法中物体进行的投影变换,就像矩阵的平移变换 */
32       glPushMatrix();
33           RenderObjects();
34       glPopMatrix();
35 
36     glPopMatrix();
37 
38     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);                          /**< 恢复颜色缓存写 */
39     RenderWall(walls[i]);                                                     /**< 绘制除阴影外的部分 */
40     glEnable(GL_DEPTH_TEST);                                                  /**< 启用深度测试 */
41   }
42 
43   glDisable(GL_STENCIL_TEST);       
44 
45 }

 

《OpenGL游戏编程》第9章-PlanarShadow关键代码注释

标签:style   blog   ar   color   os   sp   for   div   log   

原文地址:http://www.cnblogs.com/QQ122252656/p/4147618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!