unity置灰處理的實(shí)現(xiàn)
由于人眼對(duì)RGB敏剛程度不同,對(duì)綠色的敏感度最高,對(duì)紅色的敏感度次之,對(duì)藍(lán)色的敏感度最低,因此需要對(duì)RGB設(shè)置不同的權(quán)重,來(lái)達(dá)到灰度顯示的效果,比較常用的RGB權(quán)重值為 R:0.298912, G:0.586611,B: 0.114478
grayColor.rgb = float3(color.r0.298912 , color.g0.586611 ,color.b*0.114478)
1 UI對(duì)象不可用的時(shí)候顯示置灰效果
通過(guò)shader進(jìn)行控制置灰,shader中添加變量 _ShowGray,在代碼中可以通過(guò)動(dòng)態(tài)給改變量賦值的方式,控制是否進(jìn)行置灰顯示
shader 代碼是通過(guò) Image Effect shader進(jìn)行簡(jiǎn)單修改得到的,
Shader "UI/UIGray" { Properties { _MainTex ("Texture", 2D) = "white" {} [Toggle]_ShowGray("show gray", Range(0,1)) = 0 } SubShader { // No culling or depth Cull Off ZWrite Off ZTest Always //-----add code------- Blend SrcAlpha OneMinusSrcAlpha //----finish---- Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; fixed _ShowGray; fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); // just invert the colors //col.rgb = 1 - col.rgb; //----add code---- fixed gray = dot(col.rgb, float3(0.298912, 0.586611, 0.114478)); col.rgb = lerp(col.rgb, fixed3(gray, gray, gray), _ShowGray); //-----finish----- return col; } ENDCG } } }
2 場(chǎng)景中所有對(duì)象置灰,比如戰(zhàn)斗失敗時(shí)候顯示的置灰效果
場(chǎng)景置灰,一般采用的是對(duì)相機(jī)渲染進(jìn)行設(shè)置,在相機(jī)上面添加腳本,在OnRenderImage回調(diào)方法里面,對(duì)渲染對(duì)象進(jìn)行處理
腳本
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PostEffectGray : MonoBehaviour { public Material grayMaterial; void OnRenderImage(RenderTexture src, RenderTexture dest) { Graphics.Blit(src, dest, grayMaterial); } }
啟用置灰腳本
禁用置灰腳本
這里的Gray材質(zhì)球用的的shader是一個(gè)簡(jiǎn)單的置灰效果shader,代碼如下
Shader "Unlit/Gray" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv); half3 gray = dot(col.rgb, half3 (0.22, 0.707, 0.071)); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return fixed4(gray.rgb, col.a); } ENDCG } } }
到此這篇關(guān)于unity置灰處理的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)unity置灰處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# WinForm捕獲全局變量異常 SamWang解決方法
本文將介紹C# WinForm捕獲全局變量異常 SamWang解決方法,需要的朋友可以參考2012-11-11C#使用ZXing實(shí)現(xiàn)二維碼和條形碼的生成
這篇文章主要為大家詳細(xì)介紹了C#如何使用ZXing實(shí)現(xiàn)二維碼和條形碼的生成與識(shí)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11.Net Winform開發(fā)筆記(四)透過(guò)現(xiàn)象看本質(zhì)
本文將從Winform應(yīng)用程序中的Program.cs文件的第一行代碼開始逐步分析一個(gè)Winform應(yīng)用程序到底是怎樣從出生走向死亡2013-01-01