第十章 高级纹理

news/2024/10/20 5:20:00/

立方体纹理

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

立方体纹理一共包含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/news/1426929.html

相关文章

2024-04-14 问AI: 在深度学习中,为什么需要激活函数?

文心一言 在深度学习中,激活函数起着至关重要的作用,主要有以下几个原因: 引入非线性特性:深度学习的目标之一是模拟人脑的复杂功能和决策过程。然而,线性模型的组合仍然是线性的,这限制了模型的表示能力…

富格林:翻出虚假陷阱保障安全

富格林指出,在现货黄金市场中,存在着激烈的波动和虚假的陷阱风险。尽管相应的盈利潜力也很大,但需要注意的是,投资者要了解自身情况,并且利用行情的变化为自己实现安全盈利。因此,了解一些应对虚假陷阱的安…

【鸿蒙开发】第二十一章 Media媒体服务(二)--- 音频播放和录制

1 AVPlayer音频播放 使用AVPlayer可以实现端到端播放原始媒体资源,本开发指导将以完整地播放一首音乐作为示例,向开发者讲解AVPlayer音频播放相关功能。 以下指导仅介绍如何实现媒体资源播放,如果要实现后台播放或熄屏播放,需要…

vue3+vite+superMap(超图)实现通视分析

<template><div><el-dialog draggable destroy-on-close v-if"changeVisibilityState" :modal"false" v-model"changeVisibilityState"close-icon"" title"通视分析" width"20%" :before-close&qu…

DHCP是什么意思 路由器中DHCP服务器怎么设置?

概述 DHCP是什么意思&#xff1f;很多朋友在路由器设置中&#xff0c;都会看到有一项“DHCP服务器”设置功能&#xff0c;而很多朋友对这个功能不太了解&#xff0c;也不知道怎么设置。其实&#xff0c;对于普通用户来说&#xff0c;无需去单独设置路由器DHCP服务器功能&#…

【C语言__结构体__复习篇5】

目录 前言 一、结构体基础知识 1.1 结构体的语法形式 1.2 创建结构体变量 1.3 结构体变量的初始化 1.4 点(.)操作符和箭头(->)操作符 二、匿名结构体 三、结构体自引用 四、结构体内存对齐 4.1 内存对齐的规则 4.2 出现结构体内存对齐的原因 4.3 修改默认对齐数 五、结…

SpringMVC(三)【REST 风格】

1、REST 风格 1.1、REST 简介 REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表现形式状态转换 在开发中&#xff0c;它其实指的就是访问网络资源的格式 1.1.1、传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user…

使用Python实现超参数调优

超参数调优是机器学习模型调优过程中的重要步骤&#xff0c;它可以帮助我们找到最佳的超参数组合&#xff0c;从而提高模型的性能和泛化能力。在本文中&#xff0c;我们将介绍超参数调优的基本原理和常见的调优方法&#xff0c;并使用Python来实现这些方法。 什么是超参数&…