当前位置: 首页 > news >正文

【Unity Shader】切线空间下计算凹凸映射

在这里插入图片描述

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'Shader "Unlit/NormalTangent"
{Properties{_Color("Color Tint", Color) = (1, 1, 1, 1)_MainTex("Main Tex", 2D) = "While"{}//法线纹理_BumpMap("Normal Map", 2D) = "bump"{}//控制凹凸程度,为0时意味该法线纹理不会对光照产生任何影响_BumpScale("Bump Scale", Float) = 1.0_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(8.0, 256)) = 20}SubShader{Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Color;sampler2D _MainTex;float4 _MainTex_ST;sampler2D _BumpMap;float4 _BumpMap_ST;float _BumpScale;fixed4 _Specular;float _Gloss;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;float4 tangent : TANGENT;float4 texcoord : TEXCOORD0;};struct v2f{float4 pos : SV_POSITION;float4 uv : TEXCOORD0;float3 lightDir : TEXCOORD1;float3 viewDir : TEXCOORD2;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);o.uv.xy = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;o.uv.zw = v.texcoord.xy * _BumpMap_ST.xy + _BumpMap_ST.zw;TANGENT_SPACE_ROTATION;//将光照方向从模型空间转换到切线空间中,ObjSpaceLightDir是内置函数,得到模型空间中的光照o.lightDir = mul(rotation, ObjSpaceLightDir(v.vertex)).xyz;//将视角方向从模型空间转换到切线空间中,ObjSpaceViewDir是内置函数,得到模型空间中的视角方向o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;return o;}fixed4 frag(v2f i) : SV_Target{fixed3 tangentLightDir = normalize(i.lightDir);fixed3 tangentViewDir = normalize(i.viewDir);fixed4 packedNormal = tex2D(_BumpMap, i.uv.zw);fixed3 tangentNormal;//如果没有在Unity中把该法线纹理类型设置成Normal map//tangentNormal.xy = (packedNormal.xy * 2 - 1) * _BumpScale;//tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));//如果设置了Normal maptangentNormal = UnpackNormal(packedNormal);tangentNormal.xy *= _BumpScale;tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));fixed3 albedo = tex2D(_MainTex, i.uv).rgb * _Color.rgb;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(tangentNormal, tangentLightDir));fixed3 halfDir = normalize(tangentLightDir + tangentViewDir);fixed3 specular = _LightColor0.rgb * _Specular * pow(max(0, dot(tangentNormal, halfDir)), _Gloss);return fixed4(ambient + diffuse +specular, 1.0);}ENDCG}}Fallback "Specular"
}

相关文章:

【Unity Shader】切线空间下计算凹凸映射

// Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)Shader "Unlit/NormalTangent" {Properties{_Color("Color Tint", Color) (1, 1, 1, 1)_MainTex("Main Tex", 2D) "While"{}//法线纹理_BumpMap(&q…...

解决Ubuntu/Kali手动创建的启动器在dock上没有图标,且不能“添加到dock中“的问题

文章目录 问题描述问题解决解决方案 1 | 添加StartupWMClass字段解决方案 2 | 重命名文件名 如何获取 WM 值?方式 1 | xprop 命令方式 2 | 直接查看 问题描述 这个启动器无论是在菜单还是桌面都是正常的,只有在dock中没有图标,且不像其他APP…...

【Android】数据持久化——数据存储

持久化技术简介 在你打开完成了一份PPT之后关闭程序,再次打开肯定是希望之前的内容还存在在电脑上,一打开PPT,之前的内容就自动出现了。数据持久化就是将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下…...

如何通过谷歌外链快速增加网站流量?

利用谷歌外链提升流量的方法非常直接,但实际上,外链影响的是关键词排名,关键词排名提升了,自然就会有流量,所以谷歌外链不是直接能提升网站流量,而是间接的,下面,我会详细介绍几种有…...

vLLMcuda安装笔记

1. 引言 最近在部署Qwen模型时,文档上有提到强烈建议用vLLM来部署模型,按照公开的性能测试数据,用vLLM部署Qwen模型的文本推理速度要比transformers部署快3~4倍。带着这个好奇就开始安装尝试,但试下来这个安装过程并没有那么顺利…...

C++入门基本语法(2)

一、引用 1、基本概念与定义 引用不是新定义一个变量,而是给已存在的变量起一个别名,编译器不会为引用变量开辟内存空间,它和它所引用的变量公用同一块内存空间; 引用的写法:变量类型& 引用别名 变量&#xff…...

Internet Download Manager(IDM)2024中文版本有哪些新功能?6.42版本功能介绍

1. Internet Download Manager(IDM)是一款功能强大的下载管理器,支持所有流行的浏览器,并可提升下载速度高达5倍。 2. IDM具有智能下载逻辑加速器,可以设置文件下载优先级、分块下载等,提高下载效率。 IDM…...

深入理解 C 语言中的联合体

目录 引言 一、 联合体的定义与基本用法 1.联合体的定义 2.基本用法 二、 联合体与结构体的区别 1.结构体 2.联合体 3.对比 三、联合体的优势 1. 节省内存 2. 提高效率 3. 代码简洁性 四、联合体的存储细节 1.内存对齐 2.大小计算 五、联合体的高级用法 1.匿…...

OpenCV||超详细的几何变换

2D图像几何变换的33矩阵: 图像常见的几何变换: 图像来源:《OpenCV 4.5计算机视觉开发实战:基于Python》作者:朱文伟 李建英; 1. 平移(Translation) 在OpenCV中,平移不是…...

网络程序设计基础概述

文章目录 前言一、网络程序设计基础二、网络协议 1.IP协议2.TCP与UDP协议三、端口与套接字总结 前言 网络程序设计编写的是与其他计算机进行通信的程序代码。Java将网络程序所需要的东西封装成了不同的类。开发者只需要创建这些类的对象,调用相应的方法,…...

MySQL:数据库用户

数据库用户 在关系型数据库管理系统中,数据库用户(USER)是指具有特定权限和访问权限的登录账户。每个用户都有自己的用户名和密码,以便系统可以通过认证来识别他们的身份。数据库用户可以登录数据库,在其中执行各种类…...

用TensorFlow训练自己的第一个模型

现在学AI的一个优势就是:前人栽树后人乘凉,很多资料都已完善,而且有很多很棒的开源作品可以学习,感谢大佬们 项目 项目源码地址 视频教程地址 我在大佬的基础上基于此模型还加上了根据特征值缓存进行快速识别的方法,…...

MySQL数据库入门基础知识 【1】推荐

数据库就是储存和管理数据的仓库,对数据进行增删改查操作,其本质是一个软件。 首先数据有两种,一种是关系型数据库,另一种是非关系型数据库。 关系型数据库是以表的形式来存储数据,表和表之间可以有很多复杂的关系&a…...

Anaconda下的 jupyter notebook安装及使用

安装 打开Anaconda Powershell Prompt或Anconda Prompt 输入命令conda install jupyter notebook进行安装 启动 切换到工作目录,输入命令jupyter notebook等待浏览器打开网页 命令行启动jupyter notebook的链接复制到浏览器同样可以打开jupyter notebook 在Ancon…...

C语言初阶(11)

1.结构体定义 结构体就是一群数据类型的集合体。这些数据类型被称为成员变量。结构的成员可以是标量、数组、指针,甚至是其他结构体。 2.结构体的声明和结构体变量命名与初始化 结构体声明由以下结构组成 struct stu {char name[12];int age; }; 结构体命名有两…...

Unity获取Animator动画播放完成事件

整理了一些在日常经验中处理动画播放完成事件的方法 方法: 1.Dotween配合异步实现 2.状态机计时方法实现 3.原生动画行为方法实现 方法一:Dotween异步方法 using UnityEngine; using System.Threading.Tasks; using DG.Tweening;public class PlayerAnimAsync : M…...

git submodule 使用

在Git中,子模块(submodule)是一种将一个Git仓库作为另一个Git仓库的子目录嵌入的方式。这使得主仓库能够跟踪和管理对外部依赖的更改。 添加子模块 初始化父仓库:如果你还没有创建父仓库,先创建它。 添加子模块&…...

【Jenkins未授权访问漏洞 】

默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器权限。 第一步:使用fofa语句搜索 搜索语句: port&…...

前端处理 Excel 文件

引入XLSX XLSX 是一个流行的 JavaScript 库,用于处理 Excel 文件(包括 .xls 和 .xlsx 格式)。它可以在 Node.js 环境和浏览器中运行,提供了丰富的 API 来读取、写入、修改 Excel 文件。当你使用 import * as XLSX from xlsx; 这行…...

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束 需求:按勾选的顺序给后端传值 难点:在 Element UI 的 el-cascader 组件中,默认的行为是根据数据的层级结构来显示选项,用户的选择也会基于这种层级结构,el-…...

FFprobe实战:5分钟学会用JSON格式导出音视频元数据(附完整命令)

FFprobe与JSON:解锁音视频元数据的高效处理之道 在数字媒体爆炸式增长的今天,音视频内容的元数据管理已成为开发者必须掌握的技能。无论是构建自动化转码流水线、开发媒体资产管理平台,还是进行内容质量监控,快速准确地提取音视频…...

SUNFLOWER MATCH LAB 入门必看:Java开发者集成指南与八股文精讲

SUNFLOWER MATCH LAB 入门必看:Java开发者集成指南与八股文精讲 最近和几个做Java开发的朋友聊天,发现大家都有类似的烦恼:项目里想加点AI能力,比如智能问答或者文档分析,但一看那些大模型的API文档就头大&#xff0c…...

S32K3系列DIO与PORT配置实战:从EB tresos到硬件调试

1. S32K3系列DIO与PORT模块基础解析 第一次接触S32K3系列芯片的开发者,往往会对DIO和PORT这两个模块的关系感到困惑。简单来说,PORT就像是芯片引脚的功能选择器,而DIO则是控制这些引脚输入输出的开关。想象你面前有一个多功能工具箱&#xff…...

OpenMV IDE连接故障深度排查:从白灯常亮到芯片级修复

1. OpenMV连接故障的典型表现与初步诊断 当你兴冲冲地拿出OpenMV摄像头准备大展身手时,突然发现设备死活连不上OpenMV IDE,而且板子上的白灯一直亮着不灭,这种场景是不是很熟悉?作为用过十几款不同型号OpenMV的老玩家,…...

3MF转STP格式转换全攻略:迪威模型网+FreeCAD双方案实测(附常见错误修复)

3MF转STP格式转换实战手册:双轨方案与工业级修复技巧 当3D打印模型需要融入传统制造流程时,格式转换就像两种语言之间的精准翻译。3MF文件承载着丰富的打印意图,而STP格式则是工业设计领域的通用语。本文将带您深入探索两种截然不同却同样高效…...

ARM架构下内核NULL指针解引用问题深度解析与修复实践

1. ARM架构下NULL指针解引用的典型场景 最近在调试一个嵌入式Linux设备时,遇到了一个典型的NULL指针解引用问题。设备运行一段时间后,网络桥接功能突然崩溃,内核日志中出现了Unable to handle kernel NULL pointer dereference at virtual a…...

GTE中文嵌入模型应用场景解析:智能客服FAQ匹配、合同比对、专利查重

GTE中文嵌入模型应用场景解析:智能客服FAQ匹配、合同比对、专利查重 1. 什么是GTE中文文本嵌入模型 你可能已经用过各种AI工具,但有没有想过:当系统说“这两句话意思很接近”,它到底怎么判断的?答案就藏在文本嵌入&a…...

新手避坑指南:Visual Studio 2022从零配置到首个C/C++程序运行

1. Visual Studio 2022简介与准备工作 Visual Studio 2022是微软推出的集成开发环境(IDE),特别适合C/C初学者。相比旧版本,2022版最大的改进是原生支持64位架构,这意味着它能更好地利用现代电脑的性能,处理…...

告别MinGW!在Windows 10/11上用Visual Studio 2019/2022的MSVC编译FFmpeg 7.1全记录

告别MinGW!在Windows 10/11上用Visual Studio 2019/2022的MSVC编译FFmpeg 7.1全记录 如果你是一名Windows平台的音视频开发者,可能已经习惯了用MinGW来编译FFmpeg。但今天我要告诉你一个更好的选择——使用微软原生的MSVC工具链。这不仅能让你的开发环境…...

ADS54J54EVM与FPGA的JESD204B高速数据采集实战指南

1. ADS54J54EVM评估板与JESD204B接口基础 第一次拿到ADS54J54EVM这块评估板时,我对着密密麻麻的接口愣了半天。这块巴掌大的板子可不简单——它集成了四通道14位500MSPS的ADC芯片,通过JESD204B接口能实现超高速数据吞吐。简单来说,这就是个数…...