OpenGL等矩形贴图到立方体环境贴图变换技巧记录
这个网站详细介绍了整个加载过程包括代码,这里只对需要额外理解的细节做补充。
等矩形贴图是将球体的贴图展开成正方形,一个例子如下所示:
要变成的环境映射贴图的GLSL代码如下:
#version 330 core
out vec4 FragColor;
in vec3 localPos;uniform sampler2D equirectangularMap;const vec2 invAtan = vec2(0.1591, 0.3183);
vec2 SampleSphericalMap(vec3 v)
{vec2 uv = vec2(atan(v.z, v.x), asin(v.y));uv *= invAtan;uv += 0.5;return uv;
}void main()
{ vec2 uv = SampleSphericalMap(normalize(localPos)); // make sure to normalize localPosvec3 color = texture(equirectangularMap, uv).rgb;FragColor = vec4(color, 1.0);
}
其中atan(v.z, v.x)的取值为-π\piπ-π\piπ,为了使取值范围变为-0.5~0.5,需要乘以系数0.1591,asin(v.y)也是同理。
接下来的工作就是获取GLSL代码中的v了,假想我们的相机在球体中心,则要生成立方体贴图我们需要在上下左右前后6个面的方向对hdr贴图进行采样。
对6个面的方向进行记录
glm::mat4 captureViews[] ={glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)),glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f)),glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f)),glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f)),glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec3(0.0f, -1.0f, 0.0f)),glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, -1.0f), glm::vec3(0.0f, -1.0f, 0.0f))};
glm::lookAt的第一个参数指定相机位置,第二个参数指定相机朝向,第三个参数指定朝向向量的正y方向,不妨想象一下,在captureViews[0]所代表的lookAt矩阵,你面朝着坐标系-x方向,自己的头指向+y方向,但是OpenGL加载纹理时是从-y方向开始进行的,所以应该反一下,所以所有captureViews的第三个lookAt参数的y方向应该翻转由正变负。
这种翻转在learnopengl-cn有描述:
理解captureViews[2]、captureViews[3]第三个参数的一个好办法是想想你只有躺着或趴着才能看到天花板或者地板对吧,这时候你的头指向的就是OpenGL坐标系中的±Z轴方向了。
OpenGL等矩形贴图到立方体环境贴图变换技巧记录相关推荐
- 透明光照模型与环境贴图之2:环境贴图
摘抄"GPU Programming And Cg Language Primer 1rd Edition" 中文 名"GPU编程与CG语言之阳春白雪下里巴人" ...
- openGL环境贴图
openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.代码 1.主程序 二.着色器程序 1.顶点着色器 2.片元着色器 运行效果 总结 源码下载 前言 在照明和材质章节中,我们考虑了 ...
- Terragen 4生成环境贴图教程
Terragen 4是一个程序化生成自然景观的软件,跟VUE功能相近.但是比起VUE来说,它更袖珍,更轻量级.由于它可以快速生成自然景观,主要是大气+地形+光照,我们可以使用它快速生成环境贴图供我们游 ...
- OpenGL立方体纹理贴图
OpenGL正方体纹理贴图 0. 写在最前面 1. 正方体顶点属性构建 2. 绑定多个VAO.VBO 3. 创建多个纹理 4. 渲染循环 5. 实现代码 6. 多个立方体纹理贴图 0. 写在最前面 要 ...
- three.js使用CubeCamera创建反光效果,动态环境贴图实现,立方体全景贴图(vue中使用three.js83)
使用CubeCamera创建反光效果 1.demo效果 2. 实现要点 2.1 创建立方体相机CubeCamera 2.2 使用动态环境贴图材质 2.3 render中更新立方体相机 2.4 创建场景 ...
- opengl实现经纹理映射的旋转立方体_《图形编程技术学习》(五十三)环境映射...
一.环境映射(Environment Mapping) 1.具有光滑表面的物体会反射形成周围环境的影像 2.属于环境光效果 二.如何实现这种效果 1.光线跟踪(全局光照技术)可以实现这种效果,但效率太 ...
- 图形学笔记(八)着色2 —— 纹理映射、重心坐标、双线性插值、Mipmap、三线性插值、各向异性过滤、纹理的应用(环境贴图、法线贴图等)
图形学笔记(七)着色 -- Blinn-Phone 反射模型.着色频率.渲染管线.GPU 图形学笔记(九)几何 --几何表示方法(CSG.距离函数.水平集 .点云.网格(obj格式)).贝塞尔曲线(面 ...
- 【OpenGL】笔记二十四、立方体贴图
1. 流程 之前我们使用了不少2D形式的贴图,那么现在有没有其他类型的贴图呢?当然有,比如立方体贴图,它就是由6个2D贴图组合而成的: 那么为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的 ...
- three.js 环境贴图
效果: 环境贴图中用到了 立方体纹理 加载器,加载6张图片后(图片要长宽相等),得到一个立方体纹理对象,然后赋值给 材质的 envMap 即可: 代码: <!DOCTYPE html> & ...
最新文章
- OpenCV 错误:无法打开摄像头(打开摄像头卡机)
- [征求意见]关于增加Java技术区
- 第十一天 • 库塔山植物园
- 嵌入式系统低功耗管理(备忘)
- java 判断exception类型_Checked Exception | Java语言设计者的失误?
- ClickHouse【环境搭建 02】设置用户密码的两种方式(明文+SHA256)及新用户添加及只读模式 Cannot execute query in readonly mode 问题解决
- ai如何旋转画布_「AI教程」使用AI制作3D立体文字效果
- 需求简报_代码简报:NASA将所有研究成果发布为开放数据
- CICD联动阿里云容器服务Kubernetes实践之Bamboo篇
- 深度学习-为什么用激活函数
- vc6.0 debug 比 release 快??_快速入门快应用——quickapp构建与发布
- 用户扫描二维码进入公众号后自动发送指定消息_公众号裂变,社群裂变,个人号裂变,运营操作指南...
- 4月第2周安全回顾 微软发布4月补丁 新僵尸网络出现
- 小学计算机图形组合教案,小学三年级信息技术下册组合图形名师公开课优质教案人教版...
- 解决tf报Graph disconnected错误
- [SCOI2014]方伯伯的玉米田
- C++查询文本中所有单词出现的频率,并且根据出现次数由多到少依次排列。
- 对 cplex/gurobi MPS/LP文件格式的理解
- Winform从入门到精通(41)——FileSystemWatcher(史上最全)
- ***Java之父:詹姆斯高斯林的传奇人生***