Box Projected Cubemap Environment Mapping

来源:互联网 发布:国外类似淘宝的网站 编辑:程序博客网 时间:2024/05/03 17:31

         立方体映射于1986年首次斯内德格林在他的论文“环境映射和预测世界其他应用程序”提出[ 2 ]吉姆·博林马丁·纽厄尔十年之后首次提出环境映射了。然而由于硬件在同时访问6纹理图像的能力限制,使其一直没有得以在实际中使用。随着Nvidia 的GeForce 256的发布这个问题彻底解决。。Nvidia的立方体映射硬件“是GeForce 256一个突破性的功能。它将允许开发人员创建精确的,实时的反射。

    在现代的任何一款游戏里CubeMap随处可见,大致分为三种用法:

 1.天空盒渲染

 2.用于点光源的shadowmap

 3.Env Probe(GI)

 4.模拟实时反射(Cubemap Environment Mapping)

这次讨论的重点是模拟反射,Cubemap Environment Mapping简单来说就是用一个虚拟的立方体(cube)包围住物体,我们需要一个类似天空盒般的6张纹理贴在这个虚拟的立方体上,按照X,Y,Z轴正负方向构建4个Camera,分别对场景进行拍照,每一张图片贴到Cube的一个面上,这就完成了CubeMap的生成。




下面就可以考虑如何将Cube上的像素映射到物体上,方法很直接了当:眼睛到某个像素的向量look经过反射(以x像素的法线进行反射),反射向量reflvec射到立方体上,就在该立方体上获得一个纹素了(见下图中的Original的ray)。这就是一般的传统的Cubemap Environment Mapping。

然而按照上面的做法会感觉反射和真实场景无法匹配上。


传统的环境映射


Parallax Error

针对这样的情况,有人提出了一种修正方法来解决这个问题,将Cube的实际尺寸记录下来,用反射的ray来和cube求交,这样就可以得到真正正确的映射像素了,看起来这个方法原理上很简单,但是也是经过Cubemap用了好多年后才提出的,修正后的原理图如下:最终的效果非常不错,感觉质量上直接上了一个档次,而这个做法本身也很cheap,性价比相当高

Posted Image

img1

img2

下面给出PS里计算ray和cube相交然后用这个corrected的向量采cubemap的代码。


float3 dir = WrlPos - CamPos;float3 rdir = reflect(dir, WrlTexNorm);//BPCEMfloat3 nrdir = normalize(rdir);float3 rbmax = (EnvBoxMax - WrlPos)/nrdir;float3 rbmin = (EnvBoxMin - WrlPos)/nrdir;float3 rbminmax = (nrdir>0.0f)?rbmax:rbmin;float fa = min(min(rbminmax.x, rbminmax.y), rbminmax.z);float3 posonbox = WrlPos + nrdir*fa;rdir = posonbox - EnvBoxPos;//PBCEM endfloat3 env = texCUBE(envMap, rdir);

也可以对照原始链接结合一起看看。这个方法在Remember Me里得到了实际应用,Remember me的反射效果相当不错,基本原理就是从这里来的。

https://www.gamedev.net/topic/568829-box-projected-cubemap-environment-mapping/


0 0
原创粉丝点击