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,性价比相当高
下面给出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/
- Box Projected Cubemap Environment Mapping
- Environment Mapping
- CubeMap
- Cubemap
- openGL CG5 – Environment Mapping (环境贴图)
- Lighting and environment mapping with GLSL
- OpenGL学习: 环境纹理映射(environment mapping)
- OpenGL LIGHTING AND ENVIRONMENT MAPPING WITH GLSL
- openGL CG 系列教程5 – Environment Mapping ( 环境贴图 )
- [gpu pro]environment mapping with Floyd-Steinberg Halftoning
- 3Dshader之球形环境映射(sphere environment mapping)
- 3DShader之立方体环境映射(cubic environment mapping)
- openGL CG 系列教程5 – Environment Mapping ( 环境贴图 )
- OpenGL学习脚印: 环境纹理映射(environment mapping)
- Unity CubeMap
- cubemap generator
- Projected gradient descent
- Environment
- 08-c不使用乘法运算符计算2*16
- 二进制式子表示任意一个自然数的意义
- 黄牛凭什么抢走我们的票?
- 关于DEDECMS图集采集一些小常识
- jequery false
- Box Projected Cubemap Environment Mapping
- 我的code生活
- Java源码文件上传
- openlog, syslog, closelog
- NYOJ759 你知道这个规律吗
- 树莓派学习笔记——wiringPi I2C设备使用详解
- Oracle Database Architecture
- 我的2013
- 在Linux和Android中用C语言写系统日志