Unity3D Shader 之透视效果XRay

1、

Shader "Unlit/XRay"
{Properties{_MainTex("Texture", 2D) = "white" {}// 漫反射_Diffuse("Diffuse", COLOR) = (1,1,1,1)// XRay 效果_XRayColor("XRay Color", COLOR) = (0,1,1,1)_XRayPower("XRay Power", Range(0.00001,3)) = 0.001}SubShader{Tags { "Queue" = "Geometry+1000" "RenderType" = "Opaque" }LOD 100Pass{Stencil {Ref 254Comp AlwaysPass ReplaceZFail Keep}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;float3 worldNormal:TEXCOORD1;float3 worldPos:TEXCOORD2;};sampler2D _MainTex;float4 _MainTex_ST;float4 _Diffuse;float _Steps;float _ToonLerpWeight;float4 _RimColor;float _RimPower;v2f vert(appdata_base v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld,v.vertex);o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);return o;}fixed4 frag(v2f i) : SV_Target{// 环境光float3 ambient = UNITY_LIGHTMODEL_AMBIENT;// 贴图的本色fixed3 albedo = tex2D(_MainTex, i.uv).rgb;// 视野方向float3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));// 漫反射fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);float halfLambert = dot(worldLightDir,i.worldNormal) * 0.5 + 0.5;// 最终漫反射fixed3 diffuse = _LightColor0.rgb * albedo * _Diffuse.rgb * halfLambert;return fixed4(ambient + diffuse,1);}ENDCG}Pass{Tags{"ForceNoShadowCasting" = "true"}Name "XRay"// 添加 混合效果 注意渲染顺序 QueueBlend SrcAlpha one// 关闭深度写入ZWrite offZTest Greater  // 表示大于的时候显示(目的显示墙后面的物体)//使用Stencil进行过滤,该Shader的第一个Pass中我们向Stencil Buffer中写入一个值254,在Xray的pass中,如果stencil的值为254,则不再绘制效果Stencil {Ref 254Comp NotEqualPass KeepZFail Keep}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float4 _XRayColor;float _XRayPower;struct v2f {float4 vertex :SV_POSITION;//方法一,得到世界点,再到片元中计算视野方向//float3 worldPos:TEXCOORD0;//float3 worldNormal:TEXCOORD1;//方法二,放在Object空间下计算float3 viewDir:TEXCOORD0;float3 normal:TEXCOORD1;};v2f vert(appdata_base v) {v2f o;o.vertex = UnityObjectToClipPos(v.vertex);// 方法一,得到世界点,再到片元中计算视野方向//o.worldNormal = UnityObjectToWorldNormal(v.normal);//o.worldPos = mul(unity_ObjectToWorld,v.vertex);// 方法二,把视野方向在模型中就计算出来//o.worldNormal = UnityObjectToWorldNormal(v.normal);o.viewDir = ObjSpaceViewDir(v.vertex);o.normal = v.normal;return o;}float4 frag(v2f i) :SV_Target{/// 通过视野方向和世界法线方向求得边沿(视野方向和世界法线方向 垂直为边缘)// 方法一,得到世界点,再到片元中计算视野方向//float3 worldNormal = normalize(i.worldNormal);//float3 viewDir = normalize(UnityWorldSpaceViewDir(i.worldPos));// 方法二,把视野方向在模型中就计算出来float3 worldNormal = normalize(i.normal);float3 viewDir = normalize(i.viewDir);// 边缘float rim = 1 - dot(worldNormal,viewDir);  // 1- 让边沿为 1return _XRayColor * pow(rim,1 / _XRayPower);}ENDCG}}FallBack "Diffuse"
}

2、

Shader "Unity/XRay"
{Properties{_MainTex("Texture", 2D) = "white" {}_Diffuse("Color",Color) = (1,1,1,1)_XRayColor("XRayColor",Color) = (1,1,1,1)_XRayPower("XRayPower",float) = 0}SubShader{Tags {"Queue" = "Geometry+1000" "RenderType" = "Opaque" }LOD 100//Xray效果Pass{Name "Xray"//忽略阴影,半透明物体不需要阴影,可开启此功能Tags{ "ForceNoShadowCasting" = "true" }//开启混合Blend SrcAlpha One//不进行任何颜色信息写入ZWrite Off//大于深度缓冲池中的颜色深度的片元才进行处理 其他的全部舍弃ZTest GreaterCGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCG.cginc"#include "Lighting.cginc"float4 _XRayColor;float _XRayPower;struct v2f{float4 vertex:SV_POSITION;float3 normal:TEXCOORD0;float3 viewDir:TEXCOORD1;};v2f vert(appdata_base v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.normal = v.normal;o.viewDir = ObjSpaceViewDir(v.vertex);return o;};fixed4 frag(v2f i) :SV_TARGET{float3 NormalDir = normalize(i.normal);float3 ViewDir = normalize(i.viewDir);float rim = 1 - saturate(dot(NormalDir,ViewDir));float4 rimColor = _XRayColor * pow(rim,1 / _XRayPower);return rimColor;};ENDCG}//正常的漫反射渲染Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag #include "UnityCG.cginc"#include "Lighting.cginc"sampler2D _MainTex;float4 _MainTex_ST;float3 _Diffuse;struct v2f{float4 vertex:SV_POSITION;float2 uv:TEXCOORD0;float3 worldPos:TEXCOORD1;float3 worldNormal:TEXCOORD2;};v2f vert(appdata_base v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);o.worldPos = mul(unity_ObjectToWorld,v.vertex);o.worldNormal = UnityObjectToWorldNormal(v.normal);return o;};fixed4 frag(v2f i) :SV_TARGET{float3 worldNormalDir = normalize(i.worldNormal);float3 WorldLightDir = normalize(UnityWorldSpaceLightDir(i.worldNormal));float3 texColor = tex2D(_MainTex,i.uv);float3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * texColor.rgb;float3 diffuse = _LightColor0.rgb * _Diffuse.rgb * texColor.rgb * (dot(worldNormalDir,WorldLightDir) * 0.5 + 0.5);float3 color = diffuse + ambient;return fixed4(color,1);};ENDCG}}Fallback "Diffuse"
}

3、Highlight Plus - All in One Outline & Selection Effects

Highlight Plus - All in One Outline & Selection Effects | VFX Shaders | Unity Asset Store

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

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

相关文章

Java多线程<二>多线程经典场景

leetcode 多线程刷题 上锁上一次,还是上多次? 同步的顺序。 1. 交替打印字符 使用sychronize同步锁使用lock锁使用concurrent的默认机制使用volitale关键字 Thread.sleep() / Thread.yield机制使用automic原子类 方式1 :使用互斥访问st…

运用AI翻译漫画(二)

构建代码 构建这个PC桌面应用,我们需要几个步骤: 在得到第一次的显示结果后,经过测试,有很大可能会根据结果再对界面进行调整,实际上也是一个局部的软件工程中的迭代开发。 界面设计 启动Visual Studio 2017, 创建…

JAVA版鸿鹄云商B2B2C:解析多商家入驻直播带货商城系统的实现与应用

一、技术选型 java开发语言:java是一种跨平台的编程语言,适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架:spring boot是一个快速构建spring应用的框架,简化了开发过程&#xf…

ArkTS - @Builder自定义构建函数

这个Builder作用就是可以把组件样式抽离出来,写成公共组件,下边记录下全局自定义构建函数用法及注意的地方。 官方文档:开发者可以将重复使用的UI元素抽象成一个方法,在build方法里调用。 一、用法 下边代码,我在Co…

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装 1、环境2、安装包下载3、安装3.1 、解压3.2、配置3.3、编译安装3.4 、启动与关闭 4、安装 uuid-ossp 、plpython2u插件5、参考 1、环境 centos 7 、 postgresql 10.19 2、安装包下载 postgres 源码安装包 3、安…

(三)STM32F407 cubemx串口中断通讯

(三)STM32F407 cubemx串口中断通讯 这篇文章主要是个人的学习经验,想分享出来供大家提供思路,如果其中有不足之处请批评指正哈。废话不多说直接开始主题,本人是基于STM32F407VET6芯片,但是意在你看懂这篇文…

MyBatisPlus学习二:常用注解、条件构造器、自定义sql

常用注解 基本约定 MybatisPlus通过扫描实体类&#xff0c;并基于反射获取实体类信息作为数据库表信息。可以理解为在继承BaseMapper 要指定对应的泛型 public interface UserMapper extends BaseMapper<User> 实体类中&#xff0c;类名驼峰转下划线作为表名、名为id的…

python的课后练习总结4(while循环)

for循环用于针对序列中的每个元素的一个代码块。 while循环是不断的运行&#xff0c;直到指定的条件不满足为止。 while 条件&#xff1a; 条件成立重复执行的代码1 条件成立重复执行的代码2 …….. i 1while i < 5:print(i)i i 11、使用wh…

后端中的Dao层、Service层、Impl层、utils层、Controller层

Java Dao层 dao层叫数据访问层&#xff0c;全称为data access object&#xff0c;属于一种比较底层&#xff0c;比较基础的操作&#xff0c;具体到对于某个表、某个实体的增删改查&#xff0c;对外提供稳定访问数据库的方法 Mapper:&#xff08;DAO&#xff09; 访问数据库&am…

工作中人员离岗识别摄像机

工作中人员离岗识别摄像机是一种基于人工智能技术的智能监控设备&#xff0c;能够实时识别员工离岗状态并进行记录。这种摄像机通常配备了高清摄像头、深度学习算法和数据处理系统&#xff0c;可以精准地监测员工的行为&#xff0c;提高企业的管理效率和安全性。 工作中人员离岗…

TDD-LTE TAU流程

目录 1. TAU成功流程 1.1 空闲态TAU 1.2 连接态TAU 2. TAU失败流程 当UE进入一个小区&#xff0c;该小区所属TAI不在UE保存的TAI list内时&#xff0c;UE发起正常TAU流程&#xff0c;分为IDLE和CONNECTED&#xff08;即切换时&#xff09;下。如果TAU accept分配了一个新的…

Java程序设计——GUI设计

一、目的 通过用户图形界面设计&#xff0c;掌握JavaSwing开发的基本方法。 二、实验内容与设计思想 实验内容&#xff1a; 课本验证实验&#xff1a; Example10_6 图 1 Example10_7 图 2 图 3 Example10_15 图 4 设计思想&#xff1a; ①学生信息管理系统&#xff1a…

如何在2024年编写Android应用程序

如何在2024年编写Android应用程序 本文将介绍以下内容&#xff1a; 针对性能进行优化的单活动多屏幕应用程序 &#x1f92b;&#xff08;没有片段&#xff09;。应用程序架构和模块化 → 每个层面。Jetpack Compose 导航。Firestore。应用程序架构&#xff08;模块化特征驱动…

JS 手写 new 函数

工作中我们经常会用到 new 关键字&#xff0c;new 一个构造函数生成一个实例对象&#xff0c;那么new的过程中发生了什么呢&#xff0c;我们今天梳理下 创建一个对象对象原型继承绑定函数this返回对象 先创建一个构造函数&#xff0c;原型上添加一个方法 let Foo function (n…

Python元组与字典的基础介绍

元组(tuple) 在Python中,元组是不可变的有序元素的序列 即创建后不可以被修改 创建方式val_name ([val],[val].....) #----------声明------------ tuple_1 (1,2,3) print(tuple_1)元组的运算 虽然说元组的额元素是不可以更改的,但元组之间可以使用,,*号进行运算,运算后会…

静态网页设计——宠物狗狗网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1nk4y1X74M/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

can/CANFD数据记录仪——冬标神器

冬测案例 新能源电池在冬标中要测试电池的电性能&#xff0c;热管理&#xff0c;充电&#xff0c;SOC的性能电动车的关键组之一是动力电池&#xff0c;动力电池的表现&#xff0c;除了依赖自身的材料&#xff0c;工艺等硬件素质外&#xff0c;还依赖电池管理系统的表现&#xf…

小型洗衣机哪个牌子质量好?五款内衣洗衣机便宜好用的牌子推荐

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

Java设计模式-享元模式

目录 一、网站项目需求 二、传统方案 三、享元模式 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;原理类图 &#xff08;三&#xff09;内部状态和外部状态 &#xff08;四&#xff09;享元模式解决网站展现项目 &#xff08;五&#xff09;注意事项…

Linux系统安全

作为一种开放源代码的操作系统&#xff0c;linux服务器以其安全、高效和稳定的显著优势而得以广泛应用。 账号安全控制 用户账号是计算机使用者的身份凭证或标识&#xff0c;每个要访问系统资源的人&#xff0c;必须凭借其用户账号 才能进入计算机.在Linux系统中&#xff0c;提…