Opengl-立方体贴图(天空盒子)
立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体。你可能会奇怪,这样一个立方体有什么用途呢?为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的纹理呢?立方体贴图有一个非常有用的特性,它可以通过一个方向向量来进行索引/采样。假设我们有一个1x1x1的单位立方体,方向向量的原点位于它的中心。使用一个橘黄色的方向向量来从立方体贴图上采样一个纹理值会像是这样:
unsigned int loadCubemap(vector<std::string> faces)
{unsigned int textureID;glGenTextures(1, &textureID);glBindTexture(GL_TEXTURE_CUBE_MAP, textureID);int width, height, nrChannels;for (unsigned int i = 0; i < faces.size(); i++){unsigned char *data = stbi_load(faces[i].c_str(), &width, &height, &nrChannels, 0);if (data){glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);stbi_image_free(data);}else{std::cout << "Cubemap texture failed to load at path: " << faces[i] << std::endl;stbi_image_free(data);}}glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);return textureID;
}
关于反射
我们根据观察方向向量I¯和物体的法向量N¯,来计算反射向量R¯。我们可以使用GLSL内建的reflect函数来计算这个反射向量。最终的R¯向量将会作为索引/采样立方体贴图的方向向量,返回环境的颜色值。
void main()
{Normal = mat3(transpose(inverse(model))) * aNormal;Position = vec3(model * vec4(aPos, 1.0));gl_Position = projection * view * model * vec4(aPos, 1.0);
}
关于折射
我们有一个观察向量I¯,一个法向量N¯,而这次是折射向量R¯。可以看到,观察向量的方向轻微弯曲了。弯折后的向量R¯将会用来从立方体贴图中采样。
折射可以使用GLSL的内建refract函数来轻松实现,它需要一个法向量、一个观察方向和两个材质之间的折射率(Refractive Index)。
void main()
{ float ratio = 1.00 / 1.52;vec3 I = normalize(Position - cameraPos);vec3 R = refract(I, normalize(Normal), ratio);FragColor = vec4(texture(skybox, R).rgb, 1.0);
}
效果图:
可以看到通过立方体贴图我们实现了天空盒子,一种很远你摄像机怎么移动都不会动的效果
Opengl-立方体贴图(天空盒子)相关推荐
- 使用OpenGL 立方体贴图
openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.OpenGL 立方体贴图 二.使用步骤 1.代码 2.着色器程序 运行结果 注意 源码下载 参考 前言 对于室外3D 场景,通常 ...
- OpenGL 立方体贴图Cubemaps
OpenGL立方体贴图Cubemaps 立方体贴图Cubemaps简介 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 立方体贴图Cubemaps简介 我们已 ...
- LearnOpenGL 高级OpenGL—立方体贴图
文章目录 写在前面 立方体贴图 创建立方体贴图 天空盒 加载天空盒 显示天空盒 优化 环境映射 反射 折射 动态环境贴图 总结 写在前面 原文链接.原文应该是github上的一个项目,本文主要用来记录 ...
- OpenGL立方体贴图
OpenGL 立方贴图 Copyright NVIDIA Corporation, 1999. Commercial publication in written, electronic, or ot ...
- QT之OpenG立方体贴图
QT之OpenGL立方体贴图 1. 概述 2. 绘制天空盒 2.1 demo 3. 环境映射 3.1 反射 3.1.1 demo 3.1.2 3.2 折射 3.2.1 demo 4. 反射纹理 4.1 ...
- D3D11 立方体贴图(天空盒子)
本章将学习如何使用一个3D纹理来纹理化一个半圆形.这种技术叫做立方体贴图,且我们将使用该技术来学会如何制作一个天空盒子. 立方体贴图通常用于创建一个无限远的环境,比如天空.我们能够使用该技术通过加载一 ...
- OpenGL 核心技术之立方体贴图
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- OpenGL ES 3. 天空盒 立方体贴图
大家好,接下来将为大家介绍OpenGL ES 3. 天空盒 立方体贴图. OpenGL ES 立方体贴图本质上还是纹理映射,是一种 3D 纹理映射.立方体贴图所使的纹理称为立方图纹理,它是由 6 个单 ...
- OpenGL 入门 17:立方体贴图
立方体贴图(Cube Map) 立方体贴图是由"上下左右前后"6个2D纹理合并成的一张纹理.与2D纹理使用(u,v)坐标采样不同的是,立方体纹理使用一个方向向量进行采样. 1. 方 ...
最新文章
- Ubuntu系统---安NVIDIA 驱动后 CUDA+cuDNN 安装
- GAN版马里奥创作家来了:一个样本即可训练,生成关卡要素丰富 | 开源
- 未来人们获取收入的几个途径
- linux 代码获取当前路径,【linux】shell代码,获取当前路径,创建文件夹
- 【CTF大赛】陇剑杯-机密内存-解题过程分析
- Python爬虫开发:fake_useragent库伪造User-Agent
- azure kinect三维点云_万众期待的 【三维点云处理】 课程来啦!
- sonar扫描普通JAVA执行,SonarQube扫描源代码的方法
- block,inline和inlinke-block细节对比
- js与java对json的操作
- el-upload进度条无效,on-progress无效问题解决方案
- Mysql事物隔离级别
- jQuery 选择器简介
- 线程同步(互斥锁与信号量的作用与区别)
- word 方框中插入对号、错号符号
- freeswitch cdr mysql_freeswitch XML CDRS
- (Android7.0) init.rc与AIL(Android Init Language)语句
- dw打开html不显示表格,利用Dreamweaver处理网页表格方法
- CISCO APIC-M2无法安装APIC软件故障解决
- 今天距离2022年除夕还有多少天?春节放假倒计时在手机便签上提醒
热门文章
- 简单的JS统计静态网站访问次数
- (并查集 建立关系)食物链 -- POJ-- 1182
- 【Windows】如何判断当前鼠标是否按下左键或右键
- 安装wamp时出现httpd.exe无法找到组件MSVCR100.dll的解决办法
- Java两种核心机制
- uc/os内存管理的理解
- 如何用python创建一个下载网站-用Python下载一个网页保存为本地的HTML文件实例...
- 电脑安装python3.7说缺少-centos7:python3.7 缺少_ssl模块问题
- 自学python转行-转行Python,应该如何短期自学,达到就业水平
- 重庆python培训-重庆Python培训班学完能做什么