第十章 高级纹理

devtools/2024/10/20 11:36:38/

立方体纹理

立方体纹理是环境映射的一种实现方法。环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了一层金属一样反射出周围的环境。

立方体纹理一共包含6张图形,这些图像对应了立方体六个面。对立方体纹理采样我们需要提供一个三维的纹理坐标,这个纹理坐标表示了我们在世界空间下的一个3D方向。这个方向矢量从立方体的中心出发,当它向外部延伸时就会和立方体的6个纹理之一发生相交,采样得到的结果就是该点计算来的。

好处在于实现简单快速,效果好。缺点是当场景中引入新的物体、光源或者发生移动时,就需要重新生成立方体纹理。立方体纹理也仅可以反射环境,但不能反射使用了该立方体纹理的物体本身。

立方体纹理不能模拟多次反射的结果。

天空盒子

当我们在场景中使用天空盒子时,整个场景就被包围在一个立方体内。这个立方体的每个面使用的技术就是立方体纹理映射技术。

在Unity中,天空盒子是在所有不透明物体之后渲染的,而其背后使用的网格是一个立方体或一个细分后的球体。

创建用于环境映射的立方体纹理

立方体最常见的用处是用于环境映射,模拟金属质感的材质。

反射

使用反射的物体通常看起来像镀了层金属

通过入射光线的方向和表面法线方向来计算反射方向,再利用反射方向对立方体纹理采样即可。

Shader "Unity Shaders Book/Chapter 10/Reflection"
{Properties{_Color          ("Color Tint", Color) = (1, 1, 1, 1)//控制反射颜色_ReflectColor   ("Reflection Color", Color) = (1, 1, 1, 1)//控制材质反射程度_ReflectAmount  ("Reflect Amount", Range(0, 1)) = 1//用于模拟反射的环境映射纹理_Cubemap        ("Reflection Cubemap", Cube) = "_Skybox"{}}SubShader{Tags { "RenderType"="Opaque" "Queue"="Geometry"}Pass{Tags { "LightMode"="ForwardBase" }CGPROGRAM#pragma multi_compile_fwdbase#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"#include "AutoLight.cginc"fixed4 _Color;fixed4 _ReflectColor;fixed _ReflectAmount;samplerCUBE _Cubemap;struct  a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float3 worldPos : TEXCOORD0;fixed3 worldNormal : TEXCOORD1;fixed3 worldViewDir : TEXCOORD2;fixed3 worldRefl : TEXCOORD3;SHADOW_COORDS(4)};//计算了该顶点的反射方向v2f vert(a2v v) {v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);//物体反射到摄像机中的光线方向,可以由光路可逆的原则反向求得//计算视角方向关于顶点法线的反射方向来求得入射光线的方向o.worldRefl = reflect(-o.worldViewDir, o.worldNormal);TRANSFER_SHADOW(o);return o;}fixed4 frag(v2f i) : SV_Target {fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));		fixed3 worldViewDir = normalize(i.worldViewDir);		fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0, dot(worldNormal, worldLightDir));// 没有对i.worldRefl做归一化操作,因为用于采样的参数仅仅是作为方向变量传递给texCUBE函数的fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb * _ReflectColor.rgb;UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);//使用_ReflectAmount来混合漫反射颜色和

http://www.ppmy.cn/devtools/6756.html

相关文章

windows安装多版本node.js

首先,你需要安装 nvm。如果你还没有安装 nvm,你可以在 bash 或者其他类似的 shell 中运行以下命令进行安装: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash这将下载并运行 nvm 的安装脚本。注意&#xf…

2024年前端技术发展趋势

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

旋转量的多种表达方式与相互之间的转换

旋转在三维空间中的表示方式有很多种,以下是几种常见的旋转量表达方式: 欧拉角: 欧拉角是一种基于一系列顺序的绕不同坐标轴的旋转来表示三维旋转的方式,常用于可视化。通常包括yaw(偏航角)、pitch&#xf…

Docker - HelloWorld

原文地址,使用效果更佳! Docker - HelloWorld | CoderMast编程桅杆https://www.codermast.com/dev-tools/docker/docker-helloworld.html 开始之前 在学习本小节之前,你必须确保你正确安装了 Docker,正确安装 Docker 是后续学习的…

微服务OR单体架构

微服务OR单体架构 为什么会出现微服务和单体架构的争议?在实际的业务中,你选择的是微服务还是单体架构?在云上,哪种架构更符合未来云的发展趋势呢? 说到微服务OR单体架构,其实这两个场景并不存在很明确的争议界限的&a…

革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长

国内鞋服零售企业经过多年的发展,已经形成诸多家喻户晓的品牌,但近年来一些企业的库存问题也时常显现,高库存不仅困扰着品牌商,也使一些多年合作良好的经销商深受其害,当下的订货会制度在初期帮助企业解决了盲目生产的…

YoLo World代码块解读

MaxSigmoidAttnBlock 分别处理图像与文本特征,计算这两者的相关性,得到整个句子所有word中最大的相关性数值作为attention作用于图像特征中。 class MaxSigmoidAttnBlock(nn.Module):"""Max Sigmoid attention block."""…

数据可视化-ECharts Html项目实战(13)

在之前的文章中,我们深入学习ECharts动态主题切换和自定义ECharts主题。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 数据可视化-ECharts Html项…