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

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

《OpenGL游戏编程》第9章-PlanarShadow关键代码注释的更多相关文章

  1. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  2. DirectX 11游戏编程学习笔记之6: 第5章The Rendering Pipeline(渲染管线)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  3. C++游戏编程(一开篇)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云    邮箱: h ...

  4. 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)

    第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...

  5. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

  6. PC游戏编程(入门篇)(前言写的很不错)

    PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...

  7. 3D游戏编程大师技巧──2D引擎的编译问题

    接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...

  8. 异步编程系列06章 以Task为基础的异步模式(TAP)

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  9. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

随机推荐

  1. .SQL Server中 image类型数据的比较

    原文:.SQL Server中 image类型数据的比较 在SQL Server中如果你对text.ntext或者image数据类型的数据进行比较.将会提示:不能比较或排序 text.ntext 和 ...

  2. ArcGIS API for Silverlight开发入门准备

    原文:ArcGIS API for Silverlight开发入门准备 微软的Silverlight提供了跨浏览器和跨平台开发环境,在Web中可用于创建和展现富互联网应用(RIA,Rich Inter ...

  3. 转:【工欲善其事必先利其器】—Entity Framework实例详解

    开始本篇文章之前,先说一下Entity Framework 6 Alpha1在NuGet中已可用,原文链接http://blogs.msdn.com/b/adonet/archive/2012/10/ ...

  4. [代码片段]OSTU算法

    用在片上系统上的 //OSTU求图像的阈值 u8 otsuThreshold(u8 **img, u16 height, u16 width) { // int width = frame->w ...

  5. 通过iphone蓝牙与经过苹果MFI授权认证的硬件通讯,传输图片(转)

    http://blog.csdn.net/hwj2012/article/details/7883711 相关: http://blog.csdn.net/xufeidll/article/detai ...

  6. mongoose的promise(转发)

    Switching out callbacks with promises in Mongoose Published on July 28, 2015 mongo node mongoose pro ...

  7. [BS-04] 在iOS中对系统定义的类的readonly属性可通过KVC进行赋值

    系统提供的类的readonly属性可通过KVC进行赋值 UITabBarController.h @interface UITabBarController : UIViewController &l ...

  8. Power-BI助顾得医药济世康民

    公司简介成立于 2011 年 9 月 24 日,是一家主要以医院销售为主,集批发.配送.售后服务于一体的商业公司.现有药品储备面积 16000 平方米,开户医院 52 家,营销网络辐射山西省境内部分县 ...

  9. Python模块(json)

    json json模块,用来处理json风格的数据 一.json的数据格式 json是javascripts的标准格式,json的格式是由若干个 键/值(key,values) 对的集合,该集合可以理 ...

  10. Login failed知多少

    说起Login failed我们首先会想起密码错误,但密码错误只是众多login failed中的一个,本篇将罗列各类login failed在ERRORLOG中的表现,以及如何提取这类错误信息.通过 ...