Shadow Volume DX8

Shadow Volume是一种可以使实现阴影任意投射的高级方法。主要借助模板缓存(stencil buffer )实现对阴影区域的标识。最后借助标识进行alpha混合绘制阴影区域。

 

大致思路:

在Shadow Volume中最重要的就是找出物体相对于灯光的轮廓。然后为所有的轮廓边构造四边形。四边形的构造是这样的,将四边形的一边与轮廓边对齐,然后将另一边(相对于轮廓边的边)沿着灯光照射的方向移动到足够远,这样就形成一个很大的四边形。所有轮廓边生成的四边形将组成一个阴影体积,然后用这些四边形采用某种方式渲染到stencil buffer里面以实现阴影区域的标识。

 

重点细节:

  1. 轮廓边的识别

在轮廓识别中我目前掌握的两种方法。轮廓边是这样一种边。与边相邻的一个面朝向光源,另一个面背向光源。

  • 一种是构建一个边与两个与边相邻的面法线的结构体,然后分别用两个面的法线与灯光方向做点积,如果两个点积的值的符号不同,便可以证明此边是轮廓边。因为点积的几何含义是:如果点积大于0表明面朝向灯光,如果点积小于0表明背向灯光,
  • 另一种是将所有面朝光源的面的边加入到一个边列表,如何将边加入边列表,是这样,每个面有3条边,每个边有两个点,每个点都有索引,我们用两个点的索引表示边,加入到边列表。这样一般一个面会加入3条边,也就是6个点索引。我们在加入边列表的时候还需做这样的校验,如果列表中存在即将加入的边,就将已经存在的边去掉(即将加入的边也就不加入了)。这样最后在边列表存在就是边轮廓了。这是因为所有面向光源的面在非轮廓边上都有一次重复。所以所有非轮廓边肯定会去除。

      2.    模板缓存对阴影区域进行标识

 

首先场景正常渲染到color buffer和zbuffer中,然后在zbuffer开启的状态下,开启stencil buffer,将stencil buffer比较函数改成总能通过,将通过zbuffer的操作改为增加值。这样先渲染阴影体积的正面。然后将通过zbuffer的操作改为减一,修改剔除操作为剔除正面,然后渲染阴影体积的背面。最后stencil buffer中所有是1的区域就是阴影区域(stencil buffer初始化为0)。如果stencil buffer是两面的那么,可以将阴影体积正面和背面同时渲染,当然也就需要将剔除操作去除(否则背面会被剔除)。

 

最后就是制作一个和窗口客户区同大小的黑色四边形与stencil buffer中表示的阴影区域进行alpha混合,实现将阴影绘画出来。四边形的肯定需要采用XYZRHW格式(即已经经过变换的坐标)。

 

具体案例参照早期DirectX9的Demo  --- Shadow Volume。

 

具体的解说还是要参照详细教材。

 

 

时间: 2024-10-29 13:36:50

Shadow Volume DX8的相关文章

对志愿从事IT行业大学生的忠告

  作为今年2012年刚毕业的大学生,我很想发表一下本科毕业生应该如何提高自己,如何让自己屹立于IT之林的观点.其实所有人都知道,只要你有能力,IT一林就有你的一席之地.如何让自己有很好的能力,如何让自己舒舒服服成长确实是令多数新人头疼的事.     我觉得一个IT新人能够舒舒服服的成长非常非常重要,因为要知道不是所有新人都能承受各种高手代码带来的厌烦.所以如果一个新人到处学习却碰的满身伤,我想这个新人继续前进的动力会大大削减.我很高兴,我自己找到一个快乐成长的方法,一路走来,虽然有点漫长,但却

一起谈.NET技术,Silverlight 2.5D RPG游戏技巧与特效处理:(三)动态光影

通常来说,只要谈到影子及影子制作,首先想到的不外乎3D.游戏中的影子设计大致可分为硬实现和软实现两种,比如像"游戏影子制作技术"这篇文章所谈到3D游戏影子制作方案Projective Shadow.Shadow Map以及Shadow Volume均属于硬实现.硬实现的效果最逼真,相对的运算量也较高:而对于Silverlight开发2.5D网游来说,我们通常会采用折中的软实现去表述场景中的动态光影效果.精致的光影能让玩家充分体验到空间立体感,当然也是2.5D网游所不可或缺的条件之一.

Silverlig“.NET研究”ht 2.5D RPG游戏技巧与特效处理:(三)动态光影

通常来说,只要谈到影子及影子制作,首先想到的不外乎3D.游戏中的影子设计大致可分为硬实现和软实现两种,比如像"游戏影子制作技术"这篇文章所谈到3D游戏影子制作方案Projective Shadow.Shadow Map以及Shadow Volume均属于硬实现.硬实现的效果最逼真,相对的运算量也较高:而对于Silverlight开发2.5D网游来说,我们通常会采用折中的软实现去表述场景中的动态光影效果.精致的光影能让玩家充分体验到空间立体感,当然也是2.5D网游所不可或缺的条件之一.

windows-Volume Shadow Copy初始化中InitializeForBackup函数问题

问题描述 Volume Shadow Copy初始化中InitializeForBackup函数问题 根据window提供的Volume Shadow Copy service API来实现快照功能,但是在初始化函数InitializeForBackup的时候,报错0x80042302.网上百度了说是服务没有启动,Volume Shadow Copy和Microsoft Software Shadow Copy Provider我已经启动并且重启,但是调用InitializeForBackup还

谈谈 Docker Volume 之权限管理(一)

Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录,可以为容器应用存储提供有价值的特性: 持久化数据与容器的生命周期解耦:在容器删除之后数据卷中的内容可以保持.Docker 1.9之后引进的named volume(命名文件卷)可以更加方便地管理数据卷的生命周期:数据卷可以被独立地创建和删除. 数据卷可以用于实现容器之间的数据共享 可以支持不同类型的数据存储实现 Docker缺省提供了对宿主机本地文件卷的支持,可以将宿主机的目录挂载到容器之中.由于没有容器分

网页设计工具Shadow:移动设备网页制作

文章描述:Adobe推出移动网页设计工具Shadow. 3月9日消息,Adobe宣布推出新的网页设计工具Shadow,该工具可以协助网页设计师在多个移动设备中检视网页,并进行调整.Adobe同时也更新其HTML5动画工具软件Edge到Preview4.  Shadow分为三个部分,计算机端的主程序.计算机端Chrome浏览器扩充功能及行动设备端App.目前主程序支持Windows7及Mac OS X,可以从Adobe Lab网页中下载,预计今年底正式发行.移动装置则支持iOS及Android,需

CSS滤镜之Shadow属性

ado|css|滤镜 Shadow属性可以在指定的方向建立物体的投影.它的表达式是这样的: Filter:Shadow(Color=color,Direction=direction) 在这里,Shadow有两个参数值:Color参数用来指定投影的颜色:Direction参数用来指定投影的方向. 这里说的方向与我们在第二节Blur属性中提到的"方向与角度的关系"是一样的. 也许您会问,前面讲到的Dropshadow属性和Shadow属性有什么不同吗? 光说的话,您恐怕还难以理解,让我们

CSS滤镜:Shadow属性

ado|css|滤镜 Shadow属性可以在指定的方向建立物体的投影.它的表达式是这样的: Filter:Shadow(Color=color,Direction=direction) 在这里,Shadow有两个参数值:Color参数用来指定投影的颜色:Direction参数用来指定投影的方向. 这里说的方向与我们在第二节Blur属性中提到的"方向与角度的关系"是一样的. 也许您会问,前面讲到的Dropshadow属性和Shadow属性有什么不同吗? 光说的话,您恐怕还难以理解,让我们

CSS 滤镜——Shadow滤镜

ado|css|滤镜 Shadow 滤镜语法 {filter:shadow(color=color,direction=direction)} 利用"Shadow"属性可以在指定的方向建立物体的投影,COLOR是投影色,DIRECTION是设置投影的方向.其中0度代表垂直向上,然后每45度为一个单位.它的默认值是向左的270度. 效果如下: CSS滤镜实现 代码 效果拷屏 欢迎光临 <td style=filter:shadow(color=red, direction=45&g