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#將PDF文檔轉(zhuǎn)換為Markdown文檔的代碼實(shí)現(xiàn)
將PDF文件轉(zhuǎn)換為Markdown格式是一個(gè)非常實(shí)用的需求,尤其是在需要將內(nèi)容從固定布局的PDF文件中提取出來(lái),并轉(zhuǎn)換為更易于編輯和處理的文本格式時(shí),本文將介紹如何通過(guò)C#代碼將PDF文檔轉(zhuǎn)換Markdown(MD)文檔,需要的朋友可以參考下2024-10-10
使用Deflate算法對(duì)文件進(jìn)行壓縮與解壓縮的方法詳解
本篇文章是對(duì)使用Deflate算法對(duì)文件進(jìn)行壓縮和解壓縮的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
c#通過(guò)unicode編碼判斷字符是否為中文示例分享
本文介紹了c#通過(guò)unicode編碼判斷字符是否為中文的示例,在unicode字符串中,中文的范圍是在4E00..9FFF:CJK Unified Ideographs。通過(guò)對(duì)字符的unicode編碼進(jìn)行判斷來(lái)確定字符是否為中文2014-01-01
詳解C#異步多線(xiàn)程使用中的常見(jiàn)問(wèn)題
本文主要介紹了C#異步多線(xiàn)程使用中的常見(jiàn)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C#實(shí)現(xiàn)將PDF轉(zhuǎn)為線(xiàn)性化PDF
線(xiàn)性化PDF文件是PDF文件的一種特殊格式,可以通過(guò)Internet更快地進(jìn)行查看。這篇文章主要介紹了如何通過(guò)C#實(shí)現(xiàn)將PDF轉(zhuǎn)為線(xiàn)性化PDF,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12
C#使用xsd文件驗(yàn)證XML格式是否正確的實(shí)現(xiàn)方法
這篇文章主要介紹了C#使用xsd文件驗(yàn)證XML格式是否正確的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了C#針對(duì)xml文件的創(chuàng)建、驗(yàn)證相關(guān)操作技巧,需要的朋友可以參考下2017-01-01

