3D模板阴影原理

1:先从3dsMax中导出一个简单的场景,一个园环,球,平面。
2:园环直接面向光源,园环对球体来说是一个光线的阻挡物,园环在它上面形成阴影,同时,园环和球体对平面来说是光线的阻挡物,所以,同时在其上面形成阴影。

3: 要产生模板阴影,先要找出在园环和球体上面面向光线的面,去除背向光线的面,通过测试光线同园环和球体上面每一个所组成的小角形的法线的夹角是否小于90度,即光线矢量同法线矢量的点积要大于零。
4:在余下的所有面向光线的面中,把每个面的每条边可以保存到一个Vector中,不过在保存之前,先把该条边同已保存在Vector中的每条边先进行逐一比较,如果,找到的这条边同它的两个顶点相同,但顺序相反,则取走在Vector中的这条边。 如找不到,则把该条边加入到Vector中,最后将得到一条(或两条)轮廓线(见图红色线)。
5: 把轮廓线上的每个点延着光线方向延长一定的长度(见黄线),黄线所构成的面(所谓的阴影体)同场景去作比较,即模板测试(stencil) 最后画出阴影部分和非阴影部分,这就是基本的原理。

以下摘自《pro ogre 3D programing 》

模板阴影

模板阴影的概念很简单,影子的形状是根据对象的轮廓和给定的灯光位置计算产生。图11-3中很清晰地展示了相应的原理。在这里需要注意一下,Ogre为阴影提供了一个调试模式,当打开这个功能的时候我们可以看到阴影的空间体积。

11-3在Demo_Shadows演示程序中使用调制模板阴影并且启用阴影调试模式

阴影体积

阴影体积是物体轮廓边缘所围成的空间,其中的一端以模型作为封口,另一端的封口通过以下规则得到:

·如果可编程图形硬件管线可用,顶点程序将使用无穷远来产生空间包围体积。

·当顶点程序无法使用的时候,阴影体积的另外一端通过对灯光衰弱(点光和聚光)的计算来得到,也可以直接通过SceneManager::setShadowDirectionalLightExtrusionDistance()方法来构造。

警告:如果在使用的环境中无法开启对顶点程序的使用,Ogre将不得不使用有限的阴影体积。在这时候需要避免物体太靠近光源,否则就会面临广阔的阴影体积无法在内部产生物体阴影的风险。

阴影体积会在场景空间中形成一个所谓的模板(Stencil)。所有在这个模板内部物体的像素都会被绘制上阴影,而外面的像素则不会。当阴影体积与某一个物体(例如在图11-4中的地面)相交的时候,模板缓存会被更新(在GPU中的一种缓存,类似深度缓存),这个更新将会让相应的像素被渲染成为在“阴影内部”或者“阴影外部”。

11-4Demo_Shadows演示程序中启用阴影调试,表现了阴影体积与地面物体的相交

在图11-4中,通过地板和阴影体积相交而产生的模板,在其中的像素被渲染成暗色调,而外部的其他部分仍然进行普通的渲染。

因为模板阴影技术天生的性质,导致了模板阴影技术实现的影子边缘锐利的结果,在影子内部和外部之间形成了一个明显的边缘。这种类型阴影的好处是即使拉得很长也不会失真(例如黄昏或者黎明时候所产生的物体阴影),但同时意味着阴影的边缘会显得过分明显(特别是当影子被拉长的时候)。Ogre没有提供“让我的阴影变得软化”的开关,而事实上,对于模型板阴影技术来说也不可能有“软”的实现方式。在演示程序Demo_Shadows中使用了这一章节的相应阴影技术。

3D模板阴影原理的更多相关文章

  1. 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)

    前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...

  2. 裸眼3D立体显示技术原理详解

    众所周知,现实世界是一个三维空间,除去时间这一维度,现实世界是由长度.宽度和高度三个维度组成,我们每天就生活在这个三维世界中,而现有的显示设备大多数都只能显示二维信息,并不能带给人真实的三维感觉.为了 ...

  3. smarty模板引擎原理解析

    //php 控制器文件 <?php//引入模板引擎文件include("20130304.php");$smarty =newTinySmarty();$qq_numbers ...

  4. JavaScript模板引擎原理

    JavaScript模板引擎原理,几行代码的事儿 2013-12-03 16:35 by BarretLee, 650 阅读, 6 评论, 收藏, 编辑 一.前言 什么是模板引擎,说的简单点,就是一个 ...

  5. phpcms模板生成原理

    phpcms模板生成原理2009-09-25 16:14PHPCMS是功能强大的网站管理系统.以后有时间,俺要将其管理.使用.再开发等等都理顺出来.这一篇短文先介绍PHPCMS的模板机制. 所谓网站模 ...

  6. DEM山体阴影原理以及算法具体解释

    山体阴影原理以及算法具体解释 山体阴影基本原理: 山体阴影是假想一个光源在某个方向和某个太阳高度的模拟下.用过临近像元的计算来生成一副0-255的灰度图. 一.山体阴影的主要參数: 1.  太阳光线的 ...

  7. [django]模板template原理

    django 中的render和render_to_response()和locals(): http://www.cnblogs.com/wangchaowei/p/6750512.html 什么是 ...

  8. Unity3D实现3D立体游戏原理及过程

    Unity3D实现3D立体游戏原理及过程 183 0 0     下面的教程是我今天整理的资料,教大家一步步完成自己的3D立体游戏,并向大家介绍一些3D成像的原理.     理论上,每个普通的非立体3 ...

  9. 3D立体显示技术原理与游戏应用历程简介 【转】

    本文来自 中关村ZOL 「3D 立体显示」可说是近来娱乐产业相当热门的话题,不但有好莱坞推出<阿凡达>等卖座 3D 立体电影,全球各大家电厂商也积极布局准备推出一系列支持 3D 立体显示的 ...

随机推荐

  1. (转)SQL知识_SqlParameter数组

    原文地址:http://www.cnblogs.com/FredTang/archive/2012/03/29/2423651.html 温故而知新,做做笔记先.        SqlParamete ...

  2. Java - 25 Java 包(package)

    Java 包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包 ...

  3. lunix 项目部署 *****

    linux基本管理命令 服务器上安装服务,python3.6(宿主机上的物理解释器)1.虚拟解释器virtualenv虚拟出多个干净.隔离的python解释器环境问题:管理上较为麻烦,需要找到venv ...

  4. TCP/IP_网络基础知识

    今天看到k8s的网络,顿感网络知识不是特别扎实,立马回头补一下Tcp-ip知识,顺便记录下学习的过程: 计算机与网络发展的7个阶段: 批处理时代(计算机按照顺序处理,50年代)->分时系统时代( ...

  5. 安全测试6_Web安全工具第三节(Web安全工具)

    之前学习了下安全工具前的一些基础知识,今天来学习下安全工具,这些工具是python写的. 1.敏感文件探测入门: 敏感文件探测的原理如下: 一般探测敏感文件我们都是借助工具扫描,这里我给大家推荐一个简 ...

  6. MySQL/InnoDB中,对于锁的认识

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

  7. [Unity算法]A星寻路(一):基础版本

    参考链接: https://www.cnblogs.com/yangyxd/articles/5447889.html 一.原理 1.将场景简化,分割为一个个正方形格子,这些格子称之为节点(node) ...

  8. 通俗理解caller和callee

    caller 返回一个调用当前函数的引用: callee 返回一个正在被执行函数的引用: 举个例子: 当前有函数 a() 直接使用了caller 方法: b() 直接使用了callee方法: ca() ...

  9. iframe之间通信问题及iframe自适应高度问题

    下面本人来谈谈iframe之间通信问题及iframe自适应高度问题. 1. iframe通信 分为:同域通信 和 跨域通信.所谓同域通信是指 http://localhost/demo/iframe/ ...

  10. awk的用法

    awk是什么 awk是一种优良的文本处理工具,同时也是一种脚本语言.awk的三位作者者已将它正式定义为“样式扫描和处理语言”.awk脚本允许您创建简短的程序,这些程序读取输入文件.为数据排序.处理数据 ...