【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"
}

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

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

相关文章

【学术会议征稿】第三届环境遥感与地理信息技术国际学术会议(ERSGIT 2024)

第三届环境遥感与地理信息技术国际学术会议(ERSGIT 2024) 2024 3rd International Conference on Environmental Remote Sensing and Geographic Information Technology(ERSGIT 2024) 第三届环境遥感与地理信息技术国际学术会议(ERSGIT 20…

JavaEE---Spring MVC(2)

5.传递数组 当请求中参数是多个的时候,浏览器就会封装成一个数组 下面是在postman中返回的值 6.传递集合 运行的时候报错了,状态码是500,表示此时是服务器的错误,我们去查看后端源码发现 默认封装的是数组而不是List接口 修改方式: 此时我们就拿到了列表的值 状态码是HT…

移动UI:活泼风格如何识别,有什么应用场景。

在移动UI设计中,活泼风格通常具有以下特征: 1. 鲜艳的色彩: 活泼风格的移动UI通常采用鲜艳、明快的色彩,如橙色、黄色、绿色等,以增加活力和生机。 2. 元素动画: 活泼风格的UI设计通常包含丰富的动画效…

S7-1200PLC 和8块欧姆龙温控表MODBUS通信(完整SCL代码)

1、如何提升MODBUS-RTU通信数据的刷新速度 提升MODBUS-RTU通信数据刷新速度的常用方法_modbus rtu通讯慢-CSDN博客文章浏览阅读1.2k次。SMART PLC的MODBUS-RTU通信请参考下面文章链接:【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客MODBU…

Nginx进阶-常见配置(一)

一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景: 在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面&#xff0c…

2024年8月2日(安装MySQL,以及各种操作)

一、安装并配置MySQL 1、下载mysql软件包 [rootmysql ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2、解压 [rootmysql ~]# tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3、检查是否具有mariadb/mysql&…

港湾周评|俞敏洪是否理解投资者?

《港湾商业观察》李镭 围绕着东方甄选(01797.HK)、俞敏洪及董宇辉的是非仍然在坊间流传。这笔人情生意的交易也无疑引发了众多投资者,尤其是中小股东的愤慨。 在其后的解释中,俞敏洪表示:“大家也都知道最近三个月我…

计算机毕业设计选题推荐-校内跑腿业务系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

springboot专家门诊预约管理平台-计算机毕业设计源码79775

摘要 随着互联网技术的快速发展,医疗健康领域数字化需求日益增长,专家门诊预约管理平台应运而生。本研究基于Spring Boot框架开发了一款专家门诊预约管理平台。该平台涵盖了患者用户、专家用户和管理员三个角色,实现了患者的预约、评价、信息…

模型 ESBI(财富四象限)

系列文章 分享 模型,了解更多👉 模型_思维模型目录。财富自由之路的4个阶段。 1 ESBI模型的应用 1.1 一名工程师的财富自由之路 有一个名叫张伟的软件工程师,他在一家大型科技公司工作(E象限)。随着时间的推移&#…

CTF-web基础 TCP/UDP协议

传输层协议由TCP/UDP协议组成,来控制信息的传输,二者有什么区别呢,TCP比较靠谱,但是UDP速度比较快一点。 TCP协议 Transmission Control protocol, 三次握手:先给服务器传输询问要发消息,然后…

二百五十四、OceanBase——Linux上安装OceanBase数据库(四):登录ocp-express,配置租户管理等信息

一、目的 在部署OceanBase成功后,接下来就是登录ocp-express,配置租户管理等信息! 二、ocp-express网址以及账密信息 三、实施步骤 1 登录ocp-express 2 集群总览 3 租户管理 3.1 新建租户 3.2 配置新租户信息 剩下的几个模块了解即可&am…

springboot餐饮管理系统-计算机毕业设计源码73168

摘要 随着科技的不断进步和互联网时代的深入发展,餐饮行业正面临着一场由传统向智能化、信息化转变的革命。传统的餐饮管理方式,如手工点餐、纸质菜单、人工结算等,已经无法满足现代餐饮企业对于效率、准确性和用户体验的高要求。因此&#x…

快速将网站从HTTP升级为HTTPS

在当今数字化的世界中,网络安全变的越来越重要,HTTPS(超文本传输安全协议)不仅能够提供加密的数据传输,还能增强用户信任度,提升搜索引擎排名,为网站带来多重益处。所以将网站从HTTP升级到HTTPS…

服务器 Linux 的文件系统初探

好久没更新文章了,最近心血来潮,重新开始知识的累计,做出知识的沉淀~ 万事万物皆文件 文件系统:操作系统如何管理文件,内部定义了一些规则或者定义所以在 Linux 中所有的东西都是以文件的方式进行操作在 Linux 中&am…

JVM: 方法调用

文章目录 一、介绍二、方法调用的原理1、静态绑定2、动态绑定(1)介绍(2)原理 一、介绍 在JVM中,一共有五个字节码指令可以执行方法调用: invokestatic: 调用静态方法。invokespecial:调用对象…

Antd - Table 父子表格Checkbox联动

Antd - Table 父子表格Checkbox联动 前言一. 勾选父子组件联动二. 效果 前言 由于Antd中的父子组件之间,如果有多选功能,那么不会有联动的关系,需要自己实现。 一. 勾选父子组件联动 代码如下: import React, { useState } fr…

【靶场实操】sql-labs通关详解----第二节:前端页面相关(Less-11-Less-17)

SQL注入攻击是一种针对Web应用程序的安全漏洞,那么自然,SQL注入攻击也和前端页面息息相关,用户输入未被正确处理、动态查询的构建、前端JavaScript代码错误,等等我问题都可能造成安全威胁。 在上一节,我们了解了基础的…

springboot书店销售管理系统-计算机毕业设计源码09304

摘要 随着互联网的普及和发展,线上书店越来越受到人们的欢迎。为了更好地管理书店的销售活动,提高用户体验,开发一个基于Springboot的书店销售管理系统是至关重要的。这种系统可以帮助书店管理员更高效地管理书籍、订单和用户信息&#xff0c…

维修雅萌五代射频仪

维修雅萌五代射频仪,主板进水,看起来有点严重,看看这回能不能把它修好