前部分知识复习05

一、多级渐远贴图MipMap

 选择贴图,可以勾选贴图的多级渐远效果

[IntRange]_MipMap("MipMap",Range(0,12))=0     //多级渐远贴图的LOD调节滑杆

_MipMapTexture("MipMapTexture",2D)="white"{}   //定义多级渐远贴图

多级渐远贴图的采样:

float4 Mipmap=tex2Dlod(_MipMapTexture,float4(i.uv.xy,0,_MipMap));

二、立方体纹理 CubeMap

  利用立方体纹理制作反射效果:

反射效果的形成:

float3 R=reflect(-V,N);

reflect函数根据入射向量和法向量求反射向量

而向量V是从模型指向摄像机的方向的向量,所以此时的入射向量为-V

_CubeMap("CubeMap",Cube)="white"{}

samplerCUBE _Cubemap;       //声明立方体纹理

float4 Cubemap=texCUBE(_CubeMap,R);   //立方体纹理的采样

Shader"unity/Texture03"
{Properties{_MipMapTexture("MipMapTexture",2D)="white"{}[IntRange]_MipMap("MipMap",Range(0,12))=0_CubeMap("CubeMap",Cube)="white"{}}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _MipMapTexture;int _MipMap;samplerCUBE _CubeMap;struct appdate {float4 vertex : POSITION;float4 uv : TEXCOORD;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float4 uv : TEXCOORD;float3 worldNormal:TEXCOORD1;float3 worldPos : TEXCOORD2;};v2f vert(appdate v){v2f o;o.pos=UnityObjectToClipPos(v.vertex);o.worldNormal=UnityObjectToWorldNormal(v.normal);o.worldPos=mul(unity_ObjectToWorld,v.vertex);o.uv=v.uv;return o;}float4 frag(v2f i):SV_Target{float4 Mipmap=tex2Dlod(_MipMapTexture,float4(i.uv.xy,0,_MipMap));float3 N=normalize(i.worldNormal);float3 V =normalize(_WorldSpaceCameraPos-i.worldPos);float3 R=reflect(-V,N);float4 Cubemap=texCUBE(_CubeMap,R);return Cubemap;}ENDCG}}}

三、法线纹理

 法线贴图中存储的是每个像素点在切线空间下的法线向量信息

   所以采样法线贴图后的值为切线空间下的法线值

//采样法线贴图 (采样结果为切线空间下的法线值)  UnpackNormal函数通常用于解压纹理中压缩的法线信息,以获取其正确的法线
float3 normalTex=UnpackNormal(tex2D(_NormalTex,i.uv));

但是光照计算所需要的法线值为世界空间下的法线信息,所以就需要将采样后的法线值转换到世界空间下

这时就需要使用到切线空间变换矩阵,将法线信息由切线空间转换到世界空间


其中 切线 tangent 是一个四维的向量

flaot4 tangent ;   //tangent.w代表切线的方向,tangent.xyz代表坐标

  • 在顶点着色器中将模型顶点的切线由本地空间转换到世界空间

float3 worldTangent=UnityObjectToWorldDir(v.tangent);

  • 再计算切线的方向

float tangentSign=v.tangent.w*unity_WorldTransformParams.w;

  • 由世界空间法线向量和世界空间切线向量的叉值算法来计算副切线向量

(注意:此时的世界空间法线向量为模型上各像素点的法线向量,而非采样后的法线值)

//副切线由切线向量和法线向量的叉积所得
float3 worldBinormal=cross(worldNormal,worldTangent)*tangentSign;

  • 然后构建切线空间变换矩阵

//给切线空间变换矩阵赋值
o.tSpace0=float3(worldTangent.x,worldBinormal.x,worldNormal.x);
o.tSpace1=float3(worldTangent.y,worldBinormal.y,worldNormal.y);
o.tSpace2=float3(worldTangent.z,worldBinormal.z,worldNormal.z);

  • 最后在片元着色器中将采样后的法线值和变换矩阵进行点积操作得到世界空间下法线贴图中的法线值

fixed3 worldN=float3(dot(normalTex,i.tSpace0),dot(normalTex,i.tSpace1),dot(normalTex,i.tSpace2));

Shader"unity/Texture02"
{Properties{//定义法线纹理  [Normal]标签的作用是使得该纹理贴图的位置只能装载法线贴图[Normal]_NormalTex("NormalTex",2D)="white"{}}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"sampler2D _NormalTex;float4 _NormalTex_ST;struct appdate{float4 vertex:POSITION;float2 uv:TEXCOORD;float3 normal:NORMAL;//(tangent四维向量,xyz代表坐标,w代表切线的方向)float4 tangent:TANGENT;};struct v2f{float4 pos:SV_POSITION;float2 uv:TEXCOORD;//定义切线空间变换矩阵float3 tSpace0:TEXCOORD1;float3 tSpace1:TEXCOORD2;float3 tSpace2:TEXCOORD3;};v2f vert(appdate v){v2f o;o.uv=TRANSFORM_TEX(v.uv,_NormalTex);o.pos=UnityObjectToClipPos(v.vertex);//世界空间法线float3 worldNormal=UnityObjectToWorldNormal(v.normal);//将模型顶点的切线由本地空间转换为世界空间float3 worldTangent=UnityObjectToWorldDir(v.tangent);//决定切线的方向float tangentSign=v.tangent.w*unity_WorldTransformParams.w;//副切线由切线向量和法线向量的叉积所得float3 worldBinormal=cross(worldNormal,worldTangent)*tangentSign;//给切线空间变换矩阵赋值o.tSpace0=float3(worldTangent.x,worldBinormal.x,worldNormal.x);o.tSpace1=float3(worldTangent.y,worldBinormal.y,worldNormal.y);o.tSpace2=float3(worldTangent.z,worldBinormal.z,worldNormal.z);return o;}float4 frag(v2f i):SV_TARGET{	//法线纹理的采样(切线空间下的法线值)//采样法线贴图后的值为一个三维向量fixed3 normalTex=UnpackNormal(tex2D(_NormalTex,i.uv));//worldN是基于切线变换矩阵和切线空间下的法线值所计算得到的世界空间下的法线值fixed3 worldN=float3(dot(normalTex,i.tSpace0),dot(normalTex,i.tSpace1),dot(normalTex,i.tSpace2));fixed3 L=normalize(_WorldSpaceLightPos0);//lamber光照模型 max(0,dot(N,L)fixed NdotL=max(0,dot(worldN,L));return NdotL;}ENDCG}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解锁反序列化漏洞:从原理到防护的安全指南

目录 前言 一、什么是反序列化 二、反序列化漏洞原理 三、反序列化漏洞的危害 (一)任意代码执行 (二)权限提升 (三)数据泄露与篡改 四、常见的反序列化漏洞场景 (一)PHP 反…

理解 C 与 C++ 中的 const 常量与数组大小的关系

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯数组大小的常量要求💯C 语言中的数组大小要求💯C 中的数组大小要求💯为什么 C 中 const 变量可以作为数组大小💯进一步的…

MAC OS安装Homebrew

文章目录 1.下载Homebrew2.完成安装3.验证安装4.更新 Homebrew作为一个包管理器,提供了一种简便的方式来安装、更新和卸载各种命令行工具和应用程序。相比于手动下载和编译源代码,或者从不同的网站下载安装包,使用Homebrew可以显著减少这些操…

深度学习系列--04.梯度下降以及其他优化器

目录 一.梯度概念 1.一元函数 2.二元函数 3.几何意义上的区别 二.梯度下降 1.原理 2.步骤 3.示例代码(Python) 4.不同类型的梯度下降 5.优缺点 三.动量优化器(Momentum) 适用场景 1.复杂地形的优化问题 2.数据具有噪声的问…

编程AI深度实战:给vim装上AI

系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编程AI&…

2025年2月6日(anaconda cuda 学习 基本命令)

查看电脑的显卡型号是否支持CUDA的安装 https://developer.nvidia.com/zh-cn/cuda-gpus 查看可以安装的CUDA版本 https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html CUDA安装地址 https://developer.nvidia.com/cuda-toolkit-archive Anaconda下载地址 htt…

自动化构建——make/makefile

目录 背景使用推导过程如果多个文件呢?? 背景 会不会写makefile,从侧面可以说明一个人是否具有完成大型工程的能力makefile带来的好处就是——”自动化编译“,一旦写好,只需要一个make命令,整个工程完全自…

深度整理总结MySQL——SQL的执行顺序和流程

SQL的执行顺序和流程 SQL的执行顺序执行一条select语句,发生了什么呢连接器查询缓存解析SQL执行SQL预处理器优化器执行器 总结 SQL的执行顺序 这是一条标准的查询语句: 但实际上并不是从上到下去解析的,真实的执行顺序是: 我们先执行from,join来确定表之间的连接关系&#x…

R语言 | 使用 ComplexHeatmap 绘制热图,分区并给对角线分区加黑边框

目的:画热图,分区,给对角线分区添加黑色边框 建议直接看0和4。 0. 准备数据 # 安装并加载必要的包 #install.packages("ComplexHeatmap") # 如果尚未安装 library(ComplexHeatmap)# 使用 iris 数据集 #data(iris)# 选择数值列&a…

11 享元(Flyweight)模式

享元模式 1.1 分类 (对象)结构型 1.2 提出问题 做一个车管所系统,将会产生大量的车辆实体,如果每一个实例都保存自己的所有信息,将会需要大量内存,甚至导致程序崩溃。 1.3 解决方案 运用共享技术有效…

2025年Android NDK超全版本下载地址

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

【CPP】CPP经典面试题

文章目录 引言1. C 基础1.1 C 中的 const 关键字1.2 C 中的 static 关键字 2. 内存管理2.1 C 中的 new 和 delete2.2 内存泄漏 3. 面向对象编程3.1 继承和多态3.2 多重继承 4. 模板和泛型编程4.1 函数模板4.2 类模板 5. STL 和标准库5.1 容器5.2 迭代器 6. 高级特性6.1 移动语义…

安卓开发,打开PDF文件

1、把PDF文件复制到raw目录下 &#xff08;1&#xff09;新建一个Android Resource Directory (2)Resource type 改成 raw (3) 把PDF文件复制到raw目录下 2、activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:and…

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录 说明 通常分为两种类型&#xff1a; 本地文件包含 典型的攻击方式1&#xff1a; 影响&#xff1a; 典型的攻击方式2&#xff1a; 包含路径解释&#xff1a; 日志包含漏洞&#xff1a; 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…

Git--使用教程

Git的框架讲解 Git 是一个分布式版本控制系统&#xff0c;其架构设计旨在高效地管理代码版本&#xff0c;支持分布式协作&#xff0c;并确保数据的完整性和安全性。 Git 的核心组件&#xff1a; 工作区&#xff08;Working Directory&#xff09;&#xff1a; 工作区是你在本…

Deepseek 接入Word处理对话框(隐藏密钥)

硅基流动邀请码&#xff1a;1zNe93Cp 邀请链接&#xff1a;网页链接 亲测deepseek接入word&#xff0c;自由调用对话&#xff0c;看截图有兴趣的复用代码&#xff08;当然也可以自己向deepseek提问&#xff0c;帮助你完成接入&#xff0c;但是提问逻辑不一样给出的答案是千差万…

Redis存储⑤Redis五大数据类型之 List 和 Set。

目录 1. List 列表 1.1 List 列表常见命令 1.2 阻塞版本命令 1.3 List命令总结和内部编码 1.4 List典型使用场景 1.4.1 消息队列 1.4.2 分频道的消息队列 1.4.3 微博 Timeline 2. Set 集合 2.1 Set 集合常见命令 2.2 Set 集合间命令 2.3 Set命令小结和内部编码 2.…

DeepSeek 的含金量还在上升

大家好啊&#xff0c;我是董董灿。 最近 DeepSeek 越来越火了。 网上有很多针对 DeepSeek 的推理测评&#xff0c;除此之外&#xff0c;也有很多人从技术的角度来探讨 DeepSeek 带给行业的影响。 比如今天就看到了一篇文章&#xff0c;探讨 DeepSeek 在使用 GPU 进行模型训练…

深入剖析 Bitmap 数据结构:原理、应用与优化策略

深入理解 Bitmap 数据结构 一、引言 在计算机科学领域&#xff0c;数据的高效存储和快速处理一直是核心问题。随着数据量的不断增长&#xff0c;如何用最少的空间和最快的速度来表示和操作数据变得至关重要。Bitmap&#xff08;位图&#xff09;作为一种简洁而强大的数据结构…

【后端开发】系统设计101——通信协议,数据库与缓存,架构模式,微服务架构,支付系统(36张图详解)

【后端开发】系统设计101——通信协议&#xff0c;数据库与缓存&#xff0c;架构模式&#xff0c;微服务架构&#xff0c;支付系统&#xff08;36张图&#xff09; 文章目录 1、通信协议通信协议REST API 对比 GraphQL&#xff08;前端-web服务&#xff09;grpc如何工作&#x…