图形学中,某些物体带有反射属性,会反射周围的环境。一种做法是沿着反射方向发一条光线,与场景求交,获取到交点的颜色值,作为反射的颜色。显然这种方法比较低效,更高效的方法是将被渲染物体所处的环境保存到一张贴图中,渲染时先求出渲染点的反射方向,然后将这个反射方向(向量)变换到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方式的两种形式的更多相关文章

  1. C++:一般情况下,设计函数的形参只需要两种形式

    C++:一般情况下,设计函数的形参只需要两种形式.一,是引用形参,例如 void function (int &p_para):二,是常量引用形参,例如 void function(const ...

  2. jquery插件的两种形式

    这里总结一下jquery插件的两种形式,一种是通过字面量的形式组织代码,另一种是通过构造函数的方式.下面就两种形式来分析俩个例子. 例子1: ;(function ($,window,document ...

  3. Controller@实现Controller的两种形式

    实现Controller的两种形式 形式1:仅仅实现IController接口,自定义Controller对Request的实现.形式2:在实现IController接口以后,继承Controller ...

  4. 基于 Scrapy-redis 两种形式的分布式爬虫

    基于 Scrapy-redis 两种形式的分布式爬虫 .caret, .dropup > .btn > .caret { border-top-color: #000 !important ...

  5. SQL 关于apply的两种形式cross apply 和 outer apply(转)

    转载链接:http://www.cnblogs.com/shuangnet/archive/2013/04/02/2995798.html apply有两种形式: cross apply 和 oute ...

  6. SQL 关于apply的两种形式cross apply 和 outer apply

    SQL 关于apply的两种形式cross apply 和 outer apply 例子: CREATE TABLE [dbo].[Customers]( ) COLLATE Chinese_PRC_ ...

  7. SQL关于apply的两种形式cross apply和outer apply(转载)

    SQL 关于apply的两种形式cross apply 和 outer apply   apply有两种形式: cross apply 和 outer apply   先看看语法:   <lef ...

  8. 在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编

    在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...

  9. 在sql中case子句的两种形式

    case子句,在select后面可以进行逻辑判断. 两种形式:判断相等.判断不等 一.判断相等的语法: case 列名 when ...  then ... when ...  then ... el ...

随机推荐

  1. dotfiles管理

    刚刚知道dotfiles这个东西,百度也没发现什么太有价值的讲解,还都是英文,所以自己立志来好好屡屡清楚 1.dotfiles是什么?我自己的理解:linux下(mac下)有各种app,每个人会根据自 ...

  2. 异步加载JS的4种方式(详解)

    方案1:$(document).ready <!DOCTYPE html> <html> <head> <script src="http://co ...

  3. StudyFoxCMS-8

    1.swiper插件使用 首页图片滚动插件. (1)下载:bower install swiper (2)使用:参考中文官网(http://www.swiper.com.cn/usage/index. ...

  4. jQuery表单元素非空验证

    <script type="text/javascript">                $(function(){          /************* ...

  5. 1. Swift基本变量|运算符|控制流

    Swift基于cocoa Touch框架,苹果官方为了保证Swift的可靠性,结合多种语言的特性,同时独立了一套属于自己的单独语言,结合了C,C++,OC,Java等语言. 基本变量: 1 . swi ...

  6. WPF+WEB+WinForm->>表现层共用类

    首先在解决方案里新建一个类库,然后在解决方案里新建三个项目,WPF,WEB,WinForm,但是这三个项目都需要一个计算类进行计算,那么就在新建的类库Calculator里面放一个Calculat.c ...

  7. oracle数据库的TNS配置

    TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层,监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器. TNS ...

  8. Claims Identity

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Claims;using S ...

  9. Ggoogle Protocol Buffer的使用 (基于C++语言)

    首先说明的是Protocol Buffle是灵活高效的.它的一个很好的优点(很重要的,我认为)就是后向兼容性--当我们扩展了了.proto文件后,我们照样可以用它来读取之前生成的文件. 之前已经写了关 ...

  10. Ubuntu 16.04服务器安装及软件配置

    1.配置静态地址 vim /etc/network/interfaces auto enp1s0 iface enp1s0 inet static address 192.168.1.131 netm ...