《OpenGL游戏编程》第9章-PlanarShadow关键代码注释
阴影这块确实是难点。说到阴影就必须提到投影矩阵、模板值为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关键代码注释的更多相关文章
- DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...
- DirectX 11游戏编程学习笔记之6: 第5章The Rendering Pipeline(渲染管线)
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...
- C++游戏编程(一开篇)
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云 邮箱: h ...
- 游戏编程模式 Game Programming Patterns (Robert Nystrom 著)
第1篇 概述 第1章 架构,性能和游戏 (已看) 第2篇 再探设计模式 第2章 命令模式 (已看) 第3章 享元模式 (已看) 第4章 观察者模式 (已看) 第5章 原型模式 (已看) 第6章 单例模 ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- PC游戏编程(入门篇)(前言写的很不错)
PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...
- 3D游戏编程大师技巧──2D引擎的编译问题
接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...
- 异步编程系列06章 以Task为基础的异步模式(TAP)
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- Windows游戏编程之从零开始d
Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...
随机推荐
- MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedList<T>结果集(转)
namespace Entity { public interface IPagedList { /// <summary> /// 记录数 /// </summary> in ...
- xcode7的那些坑-“Your binary is not optimized for iPhone 5” (ITMS-90096) when submitting
用Xcode7向App Store提交二进制文件是,提示ERROR ITMS-90096:"You binary is not optimized for iPhone 5...." ...
- SQL语句创建表和数据库
删除数据库,SQL Server将数据库的清单存放在master系统数据库的sysdatabases表中,只需要查看该表是否存在于该数据库中就可以了,语句如下: use master -- 设置当 ...
- Xcode插件管理
在使用Xcode的时候,公司同事使用/// 和//TODO 就能打出很多注释信息.虽然他们帮忙给我也装了,但是我却不知道怎么弄的.今天在家无聊,过来自己实践了一把. so easy. 1.我使用的是P ...
- Fiddler-002-常用配置修改
日常在应用 Fiddler 进行网络抓包时,有时需要查看服务器的类型或者其他信息,此文主要讲述实际应用中针对 Fiddler 进行的定制化配置,以方便日常的工作学习. 第一:显示服务器的类型和请求域名 ...
- ios项目生成ipa文件方法
做这些的前提是你配置好了所有的证书,如果还没先去配置证书吧. 1.打开需要生成ipa的ios项目.2.在运行按钮的后面选择ios Device3.点击Product 按钮,选择第五个Archive4. ...
- Android 关于ExpandableListView去掉里头的分割线
关于ExpandableListView去掉里面的分割线关于ExpandableListView,自己写了个类继承自BaseExpandableListAdaptergroups,childs都弄好了 ...
- 用java给php写个万能接口
package helloworld; import java.io.IOException; import javax.servlet.ServletException; import javax. ...
- iOS 开发知识小集(1)
iOS 开发知识小集(1) 2015-05-15 iOS大全 (点击上方蓝字,快速关注我们) 一直想做这样一个小册子,来记录自己平时开发.阅读博客.看书.代码分析和与人交流中遇到的各种问题.之前有过 ...
- 解决ScrollView嵌套ViewPager出现的滑动冲突问题
/** * 解决ScrollView嵌套ViewPager出现的滑动冲突问题 */ public class ScrollView1 extends ...