球面贴图,立方体贴图的比较
因为要设计AR系统,但是纠结是用cube还是Sphere mapping,cube mapping比较熟悉,但是网上关于sphere mapping的资料少之又少,只怪智商太低太原理的又看不懂,所以花了很长时间,主要是靠下面几个链接和那篇论文理解透的。总之,还是用Cube吧。。。。
参考资料:
http://www.twinklingstar.cn/2014/1322/environment-mapping/
https://forums.oculusvr.com/developer/discussion/39590/cube-vs-sphere-for-pano-projection
http://www.inf.ed.ac.uk/teaching/courses/cg/lectures/slides9.pdf
https://blog.csdn.net/seamanj/article/details/9416935
最后的链接比较直接:
Sphere mapping 是基于这样一个事实:将一个理想高反射的球体置于场景中央,从一个角度无穷远处拍摄此球体,将得到一张全景图。
例如:
当然说是全景图,但是在球体背对拍摄方向的场景是看不到的,所以这个全景图是言过其实的,但是的实际效果上是不错的。
通常我们在场景建模中朝z轴正方向,利用正交投影模拟无穷远处进行渲染就可以得到这个纹理图 或者其它方法。
得到全景图纹理,如何将这个纹理应用与其他物体上呢?
举个例子,比如需要映射茶壶上的一个点(A点),首先计算眼睛(E点)在这点的反射向量r。如何计算r?
很简单 r = 2 * (v · n)*n - v
其中v为顶点A到E的单位方向向量:v =normalize( E - A);
n为顶点A的单位法线向量。 这样得到的r也为单位向量。
现在我们得到了茶壶上A点眼睛在这点的反射向量,那么如何从纹理上找出与之对应的点呢?
很简单,我们只需要找出纹理上的某点(B点),眼睛在B点的反射向量与A点中眼睛在A点的反射向量一致即可。
注意:这里观察A点和观察B点的眼睛坐标是不一样,另外A点的单位法向量已经知道,B点的单位法向量并不知道
所以,这里我们需要假设B点中眼睛的反射向量与A点中眼睛的反射向量一致即也为r,从而求出B点的球面坐标
这里最最重要的一点是需要知道的是:纹理是从(0,0,1)方向拍摄的(即B点眼睛的坐标)(注意DX里面是(0,0,-1)),所以将知道的反射光线和(0,0,1)相加,就得出了对应的法线值。 即(r.x,r.y,r.z+1)为B点法线的值,将它进行单位化(r.x,r.y,r.z+1)/sqrt(r.x*r.x+r.y*r.y+(r.z+1.0)*(r.z+1.0)).这样就得到B点处的单位法线向量n'。
由于点B是在球面上,所以单位法线向量可以想像成点B在单位球面上,为了从3维的球面(当然只是前半球)映射到2维的单位圆上(注意只是个圆,不是正方形),只需要取n'.x,n'.y为2维纹理坐标即可完成映射。
最后这样得到的2维纹理坐标范围为[-1,1],由于纹理坐标的范围为[0,1],我们需要将坐标范围缩小一半,并右移0.5就得到纹理坐标范围。 OK,整个流程结束!
论文:Spherical, Cubic, and Parabolic Environment Mappings
球面贴图,立方体贴图的比较相关推荐
- LearnOpenGL->立方体贴图
立方体贴图 立方体贴图 在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map). 简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都 ...
- 【Unity Shader】 CubeMap(立方体贴图)
Unity Shader 立方体贴图 一.介绍CubeMap Shader中对CubeMap采样 Unity中如何制作CubeMap 二.Reflect CubeMap(反射立方体纹理用于环境映射) ...
- OpenGL 立方体贴图Cubemaps
OpenGL立方体贴图Cubemaps 立方体贴图Cubemaps简介 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 立方体贴图Cubemaps简介 我们已 ...
- LearnOpenGL 高级OpenGL—立方体贴图
文章目录 写在前面 立方体贴图 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录 ...
- LearnOpenGL学习笔记——立方体贴图
立方体贴图 在本节中,我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型:立方体贴图(Cube Map).简单来说,立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的 ...
- 立方体贴图 Cubemap
1. 立方体贴图 Cubemaps 1.1 创建立方体贴图 2. 天空盒 Skybox 2.1 加载天空盒 2.2 显示天空盒 2.3 优化 2.4 整体代码 3. 环境映射 Environment ...
- C++学习(三三六)球面贴图Sphere mapping 立方体贴图Cube mapping
1.球面贴图 1.1原理 在一幅平面纹理图像中对各个方向的颜色进行编码就相当于把一个擦得锃亮的完美球体放在环境的中央,然后在极远处用长焦镜头对它进行拍照.需要编码的区域就是覆盖整个纹理图像的一个圆形区 ...
- 基于CUDA实现立方体贴图 (Cubemaps) 转换为全景图 (Equirectangular Panorama)
在立方体贴图空间内发射光线(视线),计算球面光线(视线)会击中哪个面的哪个像素的像素值,最终生成Equirectangular全景图. InitSceneTexture():先获取Cubemaps并将 ...
- 天空图立方体贴图转化为辐照度立方体贴图
创建立方体贴图 注意:立方体贴图的大小决定被转化的辐照度贴图的精度. irradianceCubeMap = new CubeMap(32); 调用 CubeMap::CubeMap(int Cube ...
- dx12 龙书第十八章学习笔记 -- 立方体贴图
本章讨论:立方体贴图 cube map,即以特殊的方式来运用这种由6个纹理所构成的基本数组.我们可以利用这项技术方便地映射天空纹理或模拟反射. 1.什么是立方体贴图 -- Cube Map 立方体贴图 ...
最新文章
- 贴现率 vs 折现率
- JavaScript实现找出一个数的质因数primeFactors算法(附完整源码)
- 利用并查集判断一个无向图是否成树
- HDU2017新生赛 找方块
- iptables用法简介
- 字面量(literal)与 C 语言复合字面量(compound literals)
- 日语+AI语音黑科技,早道开启小语种AI智能时代!
- 【Python实践-6】将不规范的英文名字,变为首字母大写,其他小写的规范名字...
- n文件的上传和下载,struts2和springmvc
- 英特尔 XML 安全网关
- 检错纠错码(奇偶校验码 CRC循环冗余校验码 海明码)
- 【引用】100句经典刺透人心,伤愈后才能更坚强
- C语言中的二分查找法
- 需求跟踪系列 I - 入门篇
- 推荐一本书《Atomic Habits》
- Oracle(四)Oracle 函数
- Windows Server 2008 R2 英文版 修改桌面主题(Win7主题)
- Oracle 用户账号解锁、密码重置、设置密码永不过期
- OpenGL Blend
- 2019比原链全球开发者大会落幕:高举开源旗帜,聚焦区块链应用落地
热门文章
- Debugging Ruby in VS Code
- 2022-2028年中国搪胶行业市场深度分析及投资前景分析报告
- Go 学习笔记(37)— 标准命令(go build 跨平台编译、交叉编译、go clean、go run、go fmt、go install、go get)
- 1137 - Sin your life sin公式 + 枚举
- python基础:python扩展包的安装方式
- redis sentinel集群配置及haproxy配置
- 与后台交互方法一 ——Ajax
- 建立二维数组_二维数组的 DP
- hbase shell 查看列名_Hbase的简单命令使用
- 怎么将vue模板转换为html,vue中自定义html文件的模板