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 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试第一部分:基础知识总结

概念与定义 软件危机:软件危机是指落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。 软件测试(IEEE1983):软件测试是使用人工和自动手段来运行或测试某个…

vue-cli项目中vue.config.js的配置

vue-cli项目中vue.config.js的配置 一、直接上代码 一、直接上代码 let path require(path) let glob require(glob)function resolve(dir) {return path.join(__dirname, src/${dir}) }module.exports {pages: {index: {// page 的入口entry: src/main.js,// 模板来源temp…

docker的安装的详细教程,以及出现错的解决办法(阿里云)

docker的安装与使用 1.安装dnf sudo yum -y install dnf Repository extras is listed more than once in the configuration 错误:无法为仓库 appstream 找到一个有效的 baseurl 出现这个错误这是由于阿里云的版本导致的 在阿里云开发者社区有答案&#xff01…

java基于ssm框架的滁艺咖啡在线销售系统+vue论文

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装滁艺咖啡在线销售系统软件来发挥其高效地信息处理的作用&am…

技术大拿私房课:掌握Task、Thread、ThreadPool的终极秘籍!

大家好,我是小米!在这个充满技术和创新的时代,作为一名喜欢分享的技术探索者,我想和大家聊一聊一些在社招面试中常常被提到的热门话题——task、thread、threadpool。这是一组关于并发编程的核心问题,也是我们在日常工…

c语言:打印随机3球颜色小程序|练习题

一、题目 给出5种颜色&#xff0c;取出3种颜色进行组合&#xff0c;计算组合的个数。 如图&#xff1a; 二、思路分析 1、3层循环&#xff0c;每一层循环5次(有5个球) 2、排除掉三个球具有同种颜色的情况 三、代码截图【带注释】 四、源代码【带注释】 #include <stdio.h&…

<六>Python的字符串切片及常见操作

字符串的表示 在Python里&#xff0c;可以使用一对单引号、一对双引号或者一对三个双引号、一对三个单引号表示字符串。 a "Im Tom" # 一对双引号 b Tom said:"I am Tom" # 一对单引号c Tom said:"I\m Tom" # 转义字符d Tom said:"…

【linux学习】计算机概论

1. 计算机的定义 接受使用者输入指令与数据&#xff0c;经由中央处理器的数学与逻辑单元处理后&#xff0c;以产生或储存成有用的信息。 2. 计算机硬件的五大单元 输入单元、输出单元、控制单元、算数逻辑单元、主内存。 输入单元&#xff1a;键盘、鼠标、扫描器输出单元&am…

.Net7 环境安装配置

文章目录 前言一、使用步骤1.下载VS 2022 总结 前言 .NET 是一个免费的、跨平台的、开源开发人员平台&#xff0c;用于构建许多不同类型的应用程序。 一、使用步骤 1.下载VS 2022 IDE下载入口&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads/?cidlearn…

vue中动态出来返回的时间秒数,在多少范围显示多少秒,多少范围显示分,小时等等

在Vue中&#xff0c;你可以使用计算属性&#xff08;computed property&#xff09;或过滤器&#xff08;filter&#xff09;来根据动态返回的时间秒数来显示不同的时间单位&#xff0c;比如秒、分、小时等等。 下面是一个使用计算属性的示例&#xff1a; <template>&l…

霹雳吧啦Wz《pytorch图像分类》-p5ResNet网络

《pytorch图像分类》p5ResNet网络结构 1 网络中的亮点1.1 超深的网络结构1.2 residual模块1.3 Batch Normalization1.4 迁移学习简介 2 模块类代码2.1 BasicBlock&#xff08;18 & 32 layers&#xff09;2.2 Bottleneck&#xff08;50 & 101 & 152 layers&#xff…

保持宽高比

文章目录 padding实现填充 aspect-ratio 在开发中&#xff0c;多少都会碰到一个需求&#xff0c;保持一个合适的宽高比&#xff0c;比如展示一些图片或者视频的时候&#xff0c;会需要保持合适的宽高比&#xff0c;比如 4:3 16:9 等等&#xff0c;本文介绍两种方式 padding 实…

DC电源模块的应用范围与市场前景

DC电源模块的应用范围与市场前景 DC电源模块广泛应用于各种电子设备和系统中&#xff0c;包括通信设备、计算机、工业自动化设备、医疗设备、航天航空设备、新能源设备等。它们为这些设备提供稳定的直流电源&#xff0c;保证设备的正常运行。 DC电源模块主要用于为电子设备提供…

派可数据BI 助力生产企业数字化质量管理,全面提升产品品质

在制造业中&#xff0c;出了质量问题&#xff0c;生产和质检部的同事都先抱怨。大家觉得质量问题是品控部门的问题&#xff0c;生产质量有瑕疵&#xff0c;检验人员就要负责。而检验人员又觉得&#xff0c;品质是生产出来的&#xff0c;而不是检验出来的&#xff0c;只有在生产…

爬取豆瓣电影top250的电影名称(完整代码与解释)

在爬取豆瓣电影top250的电影名称之前&#xff0c;需要在安装两个第三方库requests和bs4&#xff0c;方法是在终端输入&#xff1a; pip install requestspip install bs4 截几张关键性图片&#xff1a; 豆瓣top250电影网页 运行结果 测试html文件标签的各个方法的作用&#xf…

Go语言中的HTTP路由处理

在Web开发中&#xff0c;路由处理是至关重要的部分。它决定了当用户访问某个URL时&#xff0c;服务器应该如何响应。Go语言提供了多种库和工具来处理HTTP路由。下面&#xff0c;我们将深入了解如何在Go语言中处理HTTP路由。 Go语言的net/http包本身提供了基本的功能来处理路由…

面试算法89:房屋偷盗

题目 输入一个数组表示某条街道上的一排房屋内财产的数量。如果这条街道上相邻的两幢房屋被盗就会自动触发报警系统。请计算小偷在这条街道上最多能偷取到多少财产。例如&#xff0c;街道上5幢房屋内的财产用数组[2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;3]表示…

《Aspect Sentiment Quad Prediction as Paraphrase Generation》论文阅读

文章目录 文章介绍文章模型问题定义文章模型PARAPHRASE建模 文章地址&#xff1a; https://arxiv.org/abs/2110.00796 文章介绍 这篇文章在已有的方面级情感分析任务的基础了研究了一项新的任务&#xff1a;方面级情感四元组提取&#xff08;Aspect Sentiment Quad Prediction…

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError

【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError 文章目录 【mujoco】Ubuntu20.04中解决mujoco报错raise error.MujocoDependencyError1. 报错的具体情况2. 解决过程3. 其他问题3.1 ModuleNotFoundError: No module named OpenGL3.2 ModuleNotFoundEr…

期末考试成绩一键私发

期末考试即将开始&#xff0c;学生们心心念念的当然是成绩啦&#xff01;老师们发布期末考试成绩的方式也是多种多样&#xff0c;趣味横生。 有的老师会选择传统的纸质方式。精心整理每个学生的成绩&#xff0c;然后用红笔亲自在成绩单上写下每个学生的分数。这种方式虽然古老…