立方体贴图(立方体图案设计)
liebian365 2025-03-30 18:13 22 浏览 0 评论
概念
我们经常会听到立方体贴图、经纬图、全景图这样的概念,它们描绘的都是一种能从四周观察到周围环境的高动态范围(HDR)的图片,统称为环境贴图。
环境贴图是一种用于模拟高度反射物体表面反映周围环境的技术,常见的环境贴图主要有三种:立方体贴图(CubeMap)、经纬度全景图(LatLongMap)以及球面环境图(SphereMap)。它们之间本质上没有什么区别,只不过排版布局形式不一样而已,下面是环境贴图常见的集中布局形式。
unity中常用的环境贴图是立方体贴图(CubeMap),它采用的是十字形的布局形式,
用一个简单的比喻来解释立方体贴图的形成:物体的中心位置架设一台全景相机,在场景中表现为一个长方体, 长方体的每个面都会拍摄它正前方的场景图像 , 这样就以相机为中心,就能获取到它上、下、前、后、左、右六个方向的图像, 这六张图片会被存储为一个立方体贴图(CubeMap),提供给具有反射材质的物体使用。
设置
unity中新建立方体贴图有两种方法:第一种是将hdr格式的全景图片导入项目中,设置图片的Texture Shape 为cube,这种方式是最方便快捷的。
第二种使用一种最古老的方式:create/Legacy/Cubemap,这种方式需要准备六张同一位置不同方向角度(前后、上下、左右)的图片,指定后unity会为自动生成一张立方体贴图。
采样
环境贴图的采样过程也很好理解,一束光照射到物体表面时会产生反射,反射光线会与立方体的其中一个面产生一个交点,只需要对这个交点进行采样,就能得到顶点的颜色像素值。
立方体贴图有六个面,首先需要判断顶点的反射光线与哪个面相交,这个判断方法非常简单:顶点坐标哪个分量的绝对值最大,顶点反射光就与哪个面相交。
比如顶点坐标V(-0.5,0.3,-0.1),分量绝对值最大是-5,因此这个顶点的反射光与-x指向的面相交。
知道了相交面,下一步就是求相交点,相交面标准化,它的其中一个面的分量值是确定的。比如,立方体贴图-x轴指向的面,它的x轴坐标是-1,那么只要让反射矢量的坐标乘以某个标量,让矢量的x分量也等于-1,矢量的yz分量就是交点的yz值。
举个例子反射矢量是(-0.5,0.3,-0.1),乘以2后等于(-1,0.6,-0.2),那么相交点的坐标就是(-1,0.6,-0.2)。
由于立方体贴图采样只关注方向而忽略了位置,因此它在平坦反射表面上的效果很不真实,相对的,它在曲面上可以取得较好的视觉效果。
代码
下面就来看看在代码中如何实现立方体贴图的采样。根据采样原理的理解,要获取到顶点的切线空间坐标、光源方向、法线方向和反射方向。具体代码如下:
half3 normal_dir = normalize(i.normal_world);
half3 normalData = UnpackNormal(tex2D(_NormalMap,i.uv));
//切线方向
half3 tangent_dir = normalize(i.tangent_world);
// 双切线方向
half3 binormal_dir = normalize(i.binormal_world);
// 法线方向
normal_dir = normalize(tangent_dir * normalData.x + binormal_dir * normalData.y + normal_dir*normalData.z);
// 观察方向
half3 view_dir = normalize(_WorldSpaceCameraPos.xyz - i.pos_world);
// 反射方向
half3 reflect_dir = reflect(-view_dir, normal_dir);
得到反射方向后,直接使用texCUBE方法,传入反射矢量,对贴图进行采样
// properties
_CubeMap("Cube Map", Cube) = "white"{}
//var
samplerCUBE _CubeMap;
float4 _CubeMap_HDR;
//frag
half4 colorCubeMap = texCUBE(_CubeMap,reflect_dir);
half3 env_color = DecodeHDR(colorCubeMap,_CubeMap_HDR);
通过以上两步,基本能实现对立方体贴图采样的功能。
立方体贴图拥有丰富的颜色细节,直接采样产生的效果可能会过曝,因此通常会配合Bloom 、ACES ToneMapping等后期技术来使用。
反射探针
讲了这么多立方体贴图底层技术的实现,但实际项目中可能并不需要我们这么做。在Unity项目中,我们可以为物体添加反射探针(ReflectionProbe)来实现物体的反射效果,反射探针就是根据立方体贴图的技术原理封装而成的。
默认情况下,Unity设置了一个全局反射探针,我们只需要在window-rendering-light这里点击"Generate Lighting",项目就会自动烘焙一张天空盒子的立方体贴图保存在场景目录下
可在Environment中调节全局反射探针的效果。
另外,也可以"右键/light/reflection Probe"中添加局部反射探针,点击Bake,此时反射探针会自动生成一个天空盒子的环境贴图。
但此时,反射探针并不能反射周围其他物体,如果要反射其他物体,那么其他物体需要勾选“reflection Probe Statics”,然后重新Bake
在优先级上,局部反射探针的优先级别要高于全局反射探针。
相关推荐
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
-
明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
-
首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
-
齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...
- Qt界面——搭配QCustomPlot(qt platform)
-
这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
-
老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
-
用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
-
前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...
- 掌握Visual Studio项目配置【基础篇】
-
1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
-
随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...
- Visual Studio Community 2022(VS2022)安装图文方法
-
直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...
- Qt添加MSVC构建套件的方法(qt添加c++11)
-
前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...
- Qt为什么站稳c++GUI的top1(qt c)
-
为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...
- qt开发IDE应该选择VS还是qt creator
-
如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...
- Qt 5.14.2超详细安装教程,不会来打我
-
Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...
- Cygwin配置与使用(四)——VI字体和颜色的配置
-
简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- “版本末期”了?下周平衡补丁!国服最强5套牌!上分首选
- VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符"
- 东营交警实名曝光一批酒驾人员名单 88人受处罚
- Qt界面——搭配QCustomPlot(qt platform)
- 大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写
- 测试谷歌VS Code AI 编程插件 Gemini Code Assist
- 顾爷想知道第4.5期 国服便利性到底需优化啥?
- 掌握Visual Studio项目配置【基础篇】
- 还嫌LED驱动设计套路深?那就来看看这篇文章吧
- Visual Studio Community 2022(VS2022)安装图文方法
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)