Unity3D Shader 之透视效果XRay

news2024/11/17 11:41:58

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 100




		Pass
		{
		Stencil {
				Ref 254
				Comp Always
				Pass Replace
				ZFail 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"

				// 添加 混合效果 注意渲染顺序 Queue
				Blend SrcAlpha one

				// 关闭深度写入
				ZWrite off
				ZTest Greater  // 表示大于的时候显示(目的显示墙后面的物体)

				//使用Stencil进行过滤,该Shader的第一个Pass中我们向Stencil Buffer中写入一个值254,在Xray的pass中,如果stencil的值为254,则不再绘制效果
				Stencil {
					Ref 254
					Comp NotEqual
					Pass Keep
					ZFail 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- 让边沿为 1
					return _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 Greater

            CGPROGRAM
            #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.coloradmin.cn/o/1359417.html

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

相关文章

python识别验证码+灰度图片base64转换图片

一、为后面识别验证码准备 1、base64转换为图片,保存本地、并且置灰 上文中的base64,后面的就是包含Base64编码的PNG图像的字符串复制下来 import base64 from PIL import Image import io# 这里是你的Base64编码的字符串 base64_data "iVBORw0KGgoAAAANSUhE…

记录汇川:水塔指令解释-ST

可以通过帮助查看指令手册 PLC的IO地址映射-两种方法 第一种: 新建一个全局变量表,按照如图所示建立IO地址 第二种: 直接如图所示位置定义名字 注意:IW和QB这两个前面一个有蓝色M一个没有。 蓝色的M表示模块发生变化的时候地址不会…

不用愁企业内部知识库搭建啦,照着这样做轻松解决

在现代企业中,知识是一项宝贵的资源。拥有一个完善的内部知识库可以帮助企业有效地管理和分享知识,提高团队的协作效率,促进创新和发展。然而,对于很多企业来说,搭建一个高效的知识库可能会成为一项具有挑战性的任务。…

【docker】cgroups资源限制

目录 一、cpu资源控制 1、 设置cpu使用率上限 2、设置cpu资源占用比(设置多个容器时才有效)Docker通过–cpu-shares指定cpu份额,默认为1024,值为1024的倍数。 3、设置容器绑定指定的CPU 三、内存资源控制 四、磁盘IO配额控制…

非接触式红外测温MLX90614

1.MLX90614简介 MX90614是一款由迈来芯公司提供的低成本,无接触温度计。输出数据和物体温度呈线性比例,具有高精度和高分辨率。TO-39金属封装里同时集成了红外感应热电堆探测器芯片MLX81101(温度是通过PTC或是PTAT元件测量)和信号…

原生微信小程序如何动态修改svg图片颜色及尺寸、宽高(封装svgIcon组件)

最终效果 前言 动态设置Svg图片颜色就是修改Svg源码的path中的fill属性, 通过wx.getFileSystemManager().readFile读取.xlsx文件 把文件转成base64 封装svg-icon组件 1、在项目的components下新建svg-icon文件夹,新增base64.js文件 class Base64 {cons…

深圳易图讯实景三维数字孪生系统 实景三维电子沙盘

深圳易图讯实景三维数字孪生系统是一款基于三维地理空间的数字孪生系统,首先,该系统集成了多维度地理空间数据,可以将各类数据与应用需求进行充分整合,实现数据跨界融合、场景全角度可视等功能。其次,该系统具备智能化…

36V到80V降5V1A电源芯片WT6039

36V到80V降5V1A电源芯片WT6039 宽电压12V到90V的降压DC-DC转换器WT6039,功能强大,使用广泛。 WT6039是一款功能非常强大的降压DC-DC转换器芯片,它在12V到90V的宽电压范围内都能正常工作。WT6039不仅具有使能开关控制、参考电源、误差放大器等…

gRPC - 分布式 gRPC 四种通信方式、三种代理方式(全代码演示)

目录 一、分布式 gRPC 开发 1.1、项目结构 & 前置说明 1.1.1、项目结构 1.1.2、protoc 必备依赖 1.1.3、推荐插件(简化开发) 1.1.4、protoc 生成 Java 代码说明 1.2、一元 RPC(代理方式一:阻塞式 BlockingStub&#xff…

深度学习中的准确率、精确率(查准率)、召回率(查全率)、F1值、ROC曲线的AUC值,

混淆矩阵 其中关于 TP, TN; FP, FN 的解释; 其中首字母 T,F代表预测的情况,即T代表预测的结果是对的, F代表预测的结果是错误的; 第二个字母代表预测是预测为 正样本,还是负样本, Positve 代表…

Python实现某城市从站点API获取天气状况示例(Crossin教室实例24)

一、要点说明: 根据站点当前API数据是由‘\r’字符连接的字符串的特点,主要用到了字符串的split()方法。此方法参数就是‘\r’。函数返回值是被分隔的字符串的列表。通过使用列表索引就可以分项取到天气数据。 二、示例代码: import reque…

面试被问了几百遍的 IOC 和 AOP ,一篇文章带你搞清楚!!!

面试被问了几百遍的 IOC 和 AOP ,一篇文章带你搞清楚!!! 这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 IoC?IoC 解决了什么问题?IoC 和 DI 的区别?什么是 AOP&#xff…

LeetCode206链表反转

//我来理解一下运用递归求解 class Solution { public:ListNode* reverseList(ListNode* head) {//首先判断是否为最后一个元素if(head null|| head.next null){return head;//返回末尾元素}ListNode* receive;//此时进入循环的每一层都实现了temp接收head.next的结点进行…

解决sublime中文符号乱码问题

效果图 原来 后来 问题不是出自encode文件编码,而是win10的字体问题。 解决方法 配置: { "font_face":"Microsoft Yahei", "dpi_scale": 1.0 } 参考自 Sublime 输入中文显示方框问号乱码_sublime中文问号-CSDN博…

Python新年烟花代码

Pygame 绘制烟花的基本原理 1,发射阶段:在这一阶段烟花的形状是线性向上,通过设定一组大小不同、颜色不同的点来模拟“向上发射” 的运动运动,运动过程中 5个点被赋予不同大小的加速度,随着时间推移,后面的…

LeGO-LOAM 安装以及运行

一、源码地址: GitHub - RobustFieldAutonomyLab/LeGO-LOAM: LeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable TerrainLeGO-LOAM: Lightweight and Ground-Optimized Lidar Odometry and Mapping on Variable Terrain - GitH…

报错解决:Error creating bean with name ‘userServiceImpl‘

首先:spring整合MyBatis是出现这个错误: Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name userServiceImpl: Unsatisfied dependency expressed through fiel…

你的网站或许不需要前端构建(二)

前一阵,有朋友问我,能否在不进行前端编译构建的情况下,用现代语法开发网站界面。 于是,就有了这篇文章中提到的方案。 写在前面 这篇文章,依旧不想讨论构建或不构建,哪一种方案对开发更友好,…

go-cqhttp作者停止维护——替代品OpenShamrock的使用方法

目录 前言 解决办法 配置要求 实操 刷入面具 安装lsp框架 安装OpenShamrock和QQ 注意 大功告成 前言 由于QQ官方针对协议库的围追堵截,go-cqhttp已经无力维护下去了 原文连接 QQ Bot的未来以及迁移建议 Issue #2471 Mrs4s/go-cqhttp (github.com)https…