﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Fly 3D-随笔分类-D3D</title><link>http://www.cppblog.com/tuya1988/category/10700.html</link><description>游戏编程学习博客</description><language>zh-cn</language><lastBuildDate>Wed, 27 May 2009 12:39:18 GMT</lastBuildDate><pubDate>Wed, 27 May 2009 12:39:18 GMT</pubDate><ttl>60</ttl><item><title>Shadow volum的D3D实现</title><link>http://www.cppblog.com/tuya1988/archive/2009/05/27/85940.html</link><dc:creator>陈翔飞</dc:creator><author>陈翔飞</author><pubDate>Wed, 27 May 2009 11:30:00 GMT</pubDate><guid>http://www.cppblog.com/tuya1988/archive/2009/05/27/85940.html</guid><wfw:comment>http://www.cppblog.com/tuya1988/comments/85940.html</wfw:comment><comments>http://www.cppblog.com/tuya1988/archive/2009/05/27/85940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tuya1988/comments/commentRss/85940.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tuya1988/services/trackbacks/85940.html</trackback:ping><description><![CDATA[Shadow volum实现原理：其基本原理是根据光源和遮蔽物的位置关系计算出一个多面体，然后对这个多面体进行顺时针和逆时针的两次渲染。逆时针渲染的时候使其模板值+1，在顺时针渲染的时候使其模板值-1，这样以来，模板值大于等于1的部分就是地上的阴影区域像素的模板值得。根据这个得到模板值通过模板测试，把影响渲染出来。 <br><wbr><a href="http://b19.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fc70dcd150079b506519d04cc31cd92cc2b9eaf7ef00713823af9f04332966d3e4abf7b9a253294c81047e065cc213d4d0263e260c2184ea847d5bce7bbd793b756c70acf" target=_blank><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" src="http://b19.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fc70dcd150079b506519d04cc31cd92cc2b9eaf7ef00713823af9f04332966d3e4abf7b9a253294c81047e065cc213d4d0263e260c2184ea847d5bce7bbd793b756c70acf" bLoaded="true" orgSrc="http://b19.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fc70dcd150079b506519d04cc31cd92cc2b9eaf7ef00713823af9f04332966d3e4abf7b9a253294c81047e065cc213d4d0263e260c2184ea847d5bce7bbd793b756c70acf"></a><wbr> <br><br><br>图中的绿色物体就是所谓的遮蔽物，而灰色的区域就是shadow volume <br><wbr><a href="http://b19.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34f990752a9ca2a86ad02973c9b2c2fe2735bc724d142bf13cf58b4ef556a716fec911be3443a2ce4641e2c08ce98df81aa6198eace1d06db313c048384a9e94525ceca2c6f" target=_blank><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" src="http://b19.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34f990752a9ca2a86ad02973c9b2c2fe2735bc724d142bf13cf58b4ef556a716fec911be3443a2ce4641e2c08ce98df81aa6198eace1d06db313c048384a9e94525ceca2c6f" bLoaded="true" orgSrc="http://b19.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34f990752a9ca2a86ad02973c9b2c2fe2735bc724d142bf13cf58b4ef556a716fec911be3443a2ce4641e2c08ce98df81aa6198eace1d06db313c048384a9e94525ceca2c6f"></a><wbr> <br><br><br>只有处于shadow volume里面的物体才会受阴影的影响 <br><br>实现的过程大致可以分为如下步骤： <br>1、创建阴影体（阴影体是根据当前点光源和物体的位置动态创建的，所以没RENDER一下都构建一个阴影体，所以消耗很大，但由于本文只是大概讲述了一下实现过程，并未对程序进行优化）。 <br>2、对创建的阴影体分别进行顺时针和逆时针的渲染，然后分别设置不同的模板值。最后得出来阴影部分的模板值为大于1的部分。 <br>3、也是最后一步，设置参考模板值，对像素进行有选择的渲染。在世界中得到阴影。 <br><br>程序部分： <br><wbr><a href="http://b17.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fbdc412896bccc082b7734e1cd9ee75fefc6b9f9aaf45df7fcc1c0c3f9da9299b3e520f2c929eaa25792f068f8e6e9b0b1f03835b66a4d4f3ac8d0082c5e5f6cf18ac440b" target=_blank><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" src="http://b17.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fbdc412896bccc082b7734e1cd9ee75fefc6b9f9aaf45df7fcc1c0c3f9da9299b3e520f2c929eaa25792f068f8e6e9b0b1f03835b66a4d4f3ac8d0082c5e5f6cf18ac440b" bLoaded="true" orgSrc="http://b17.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fbdc412896bccc082b7734e1cd9ee75fefc6b9f9aaf45df7fcc1c0c3f9da9299b3e520f2c929eaa25792f068f8e6e9b0b1f03835b66a4d4f3ac8d0082c5e5f6cf18ac440b" loadingTimer="51725517"></a><wbr><br><br><br><br><br>此图中CXF_Camera为一个灵活的摄像机类文件。Mesh是个网络类，用于模型网格和场景网格的导入和优化。ShadowVolume顾名思义当然是本文的关键所在，阴影类。 <br>此为还需要在世界中添加点光源，此过程详见World.cpp .如需源代码，请留言告诉我你的邮箱。 <br><br>注意：所用的网络模型必须完全闭合的，否则实现的效果将是这样： <br><wbr><a href="http://b17.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fa7ada594ae0b33514a0500160882ed93f8507cac9198ac56304667177e2704ae4a1ca6ce876547ff3d15d804009a8c17560cf7938367ac0d2b32bc4ad928c5db49d88226" target=_blank><img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" src="http://b17.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fa7ada594ae0b33514a0500160882ed93f8507cac9198ac56304667177e2704ae4a1ca6ce876547ff3d15d804009a8c17560cf7938367ac0d2b32bc4ad928c5db49d88226" bLoaded="true" orgSrc="http://b17.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8a3fb3396c72bf8cf74ffd5be353f34fa7ada594ae0b33514a0500160882ed93f8507cac9198ac56304667177e2704ae4a1ca6ce876547ff3d15d804009a8c17560cf7938367ac0d2b32bc4ad928c5db49d88226" loadingTimer="51725527"></a><wbr>&nbsp;<br><br>
<img src ="http://www.cppblog.com/tuya1988/aggbug/85940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tuya1988/" target="_blank">陈翔飞</a> 2009-05-27 19:30 <a href="http://www.cppblog.com/tuya1988/archive/2009/05/27/85940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>