球形环境映射之angular方式的两种形式
图形学中,某些物体带有反射属性,会反射周围的环境。一种做法是沿着反射方向发一条光线,与场景求交,获取到交点的颜色值,作为反射的颜色。显然这种方法比较低效,更高效的方法是将被渲染物体所处的环境保存到一张贴图中,渲染时先求出渲染点的反射方向,然后将这个反射方向(向量)变换到uv坐标,进而在贴图中查询到相应点的颜色值。过程中关键的一步是反射方向到uv坐标的变换,另外,在某种程度上,贴图的制作方式决定了变换方式。除了球形环境映射还有一种更为高质量的立方环境映射。球形环境映射又分为latlong(经纬)和angular方式,本文只讲angular方式下的两种不同的映射方式(反射方向到uv坐标的变换),这也就是前文的“在某种程度上”存在的意义。
话休絮烦,环境贴图的制作方式:待渲染物体的位置放一个铬球,相机拍摄铬球,考虑到透视投影,相机并不能拍到铬球的整个前半部分,换句话说,铬球的反射光线中不存在指向z轴正方向的光线,使用右手系,下同。但是该铬球已经很好的对大部分环境进行了反射,只有铬球正后方的一部分环境没被反射,该“被忽略”部分的大小取决于相机与铬球的距离,如果距离无限大,那么只有跟铬球最大截面等大的环境未被反射,但此时反射方向已经包含了z轴正方向,这种矛盾提醒了我们在环境不是无穷远时,该方法是不准确的,因为未考虑物体的形状(凹的物体可能发生自反射)和大小。
最常见的一种映射方式便是利用了贴图的制作方式,认为贴图是相机在无穷远处拍摄铬球得来,于是入射光线即(0,0,1),假设我们在渲染点处求得归一化的反射光线(x,y,z),法线即(x+0,y+0,z+1),很显然,归一化的法线顶点在xoy面上的投影位置即对应所要映射的贴图上的位置。考虑到纹理坐标的范围是0~1,我们进行除2加0.5的操作。RSL中代码如下(代码出自animallogic公司的mayaman头文件):
float m = 2*sqrt(x*x+y*y+(z+1)*(z+1));
U_COORD = y/m + 0.5;
V_COORD = x/m + 0.5;

另一种映射方式来自http://www.pauldebevec.com/Probes/,如果uv坐标的范围都是-1~1,我们先考虑如何把给定的某个uv坐标变换为反射方向,使用球面坐标,反射方向与z轴负方向夹角为phi,反射方向投影与x轴正向夹角为theta,theta=atan2(v,u), phi=pi*sqrt(u*u+v*v)。其中,theta的求法是显而易见的,但是phi的公式仅仅保证变换的区间及增减性正确。我们可以如此验证,取u=0.5,v=0,phi为pi/2,而实际上该点的反射方向与z轴负向夹角仍是锐角。反过来,给定反射方向(Dx, Dy, Dz),其对应的uv坐标即(Dx*r,Dy*r),其中, r=(1/pi)*acos(Dz)/sqrt(Dx^2 + Dy^2)。很显然,将原帖图贴到镜面球上之后,第一种映射方式再现了制作贴图时铬球的面貌,而第二种方式对贴图中间部分进行了放大,可如此分析,取反射方向为(1,0,0),不难计算uv坐标为(0.5,0),实际应该映射的是(0.707,0),见图。


贴图文件为
注:为避免透视投影对结果的影响(其实影响比较小),均使用平行投影。
球形环境映射之angular方式的两种形式的更多相关文章
- C++:一般情况下,设计函数的形参只需要两种形式
C++:一般情况下,设计函数的形参只需要两种形式.一,是引用形参,例如 void function (int &p_para):二,是常量引用形参,例如 void function(const ...
- jquery插件的两种形式
这里总结一下jquery插件的两种形式,一种是通过字面量的形式组织代码,另一种是通过构造函数的方式.下面就两种形式来分析俩个例子. 例子1: ;(function ($,window,document ...
- Controller@实现Controller的两种形式
实现Controller的两种形式 形式1:仅仅实现IController接口,自定义Controller对Request的实现.形式2:在实现IController接口以后,继承Controller ...
- 基于 Scrapy-redis 两种形式的分布式爬虫
基于 Scrapy-redis 两种形式的分布式爬虫 .caret, .dropup > .btn > .caret { border-top-color: #000 !important ...
- SQL 关于apply的两种形式cross apply 和 outer apply(转)
转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...
- SQL 关于apply的两种形式cross apply 和 outer apply
SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...
- SQL关于apply的两种形式cross apply和outer apply(转载)
SQL 关于apply的两种形式cross apply 和 outer apply apply有两种形式: cross apply 和 outer apply 先看看语法: <lef ...
- 在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编
在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...
- 在sql中case子句的两种形式
case子句,在select后面可以进行逻辑判断. 两种形式:判断相等.判断不等 一.判断相等的语法: case 列名 when ... then ... when ... then ... el ...
随机推荐
- 关于ORACLE隐式转换后性能问题
SELECT TM.MONEY_CODE FROM T_CONTRACT_MASTER T,T_MONEY TM WHERE T.MONEY_ID = TM.MONEY_ID AND T.POLICY ...
- 图论$\cdot$2-SAT问题
2-SAT问题是这样的:有$n$个布尔变量$x_i$,另有$m$个需要满足的条件,每个条件的形式都是“$x_i$为真/假或者$x_j$为真/假”.比如:"$x_1$为真或者$x_3$为假“. ...
- Auty自动化测试框架第二篇——读取与执行脚本列表
[本文出自天外归云的博客园] 在Auty中的文件结构,lib目录下的read_selection.py和execute_selection.py文件:
- poj 1091 跳蚤
跳蚤 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8482 Accepted: 2514 Description Z城 ...
- Java Code Examples for PhantomJSDriverService
Example 1 Project: thucydides File: PhantomJSCapabilityEnhancer.java View source code Vote up 6 vo ...
- jquery之remove(),detach()方法详解
一:remove()方法 remove()函数用于从文档中移除匹配的元素. 你还可以使用选择器进一步缩小移除的范围,只移除当前匹配元素中符合指定选择器的部分元素. 与detach()相比,remove ...
- 在网上看到的一篇文章关于js和php编码的
解决办法: 采用js对URL中的汉字进行escape编码. <a href="" onclick="window.open('product_list.php?p_ ...
- [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序实现继承
这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十一篇:为ASP.NET MVC应用程 ...
- python走起之第一话
Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- treeview递归加载
实体类: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...