日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity Shader 颜色混合

發布時間:2023/12/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity Shader 颜色混合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

混合模式
可簡單理解為 指上下層圖片相互有重疊時如何取色的一種稱呼

在編寫shader時我們可以在SubShader或Pass中用Blend與BlendOp指明該對象與下一層色彩如何進行顏色混合

常用的混合模式通過Blend實現 如下所示

SubShader{Tags { "Queue"="Transparent"}//Blend SrcAlpha OneMinusSrcAlpha //正常透明混合//BlendOp Min Blend One One //變暗//BlendOp Max Blend One One //變亮//Blend DstColor Zero //正片疊底 (Multiply)相乘 Blend OneMinusDstColor One //濾色 //柔和相加(soft Additive) //Blend DstColor SrcColor //兩倍相乘 (2X Multiply) //Blend One One //線性減淡Pass{CGPROGRAM#pragma vertex vert#pragma fragment fragENDCG}}

還可以用代碼實現混合

左圖是底圖A,右圖是要混合的圖B

Unity實現與Ps效果對比圖
(左 Unity實現 右 Ps對比)














//混合模式. Shader "Unlit/BlendMod2" {Properties{_MainTex ("Texture", 2D) = "white" {}_BlendTex ("Texture", 2D) = "white" {}}CGINCLUDE#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;sampler2D _BlendTex;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{fixed4 A = tex2D(_MainTex, i.uv); //A為底圖rgba 四維向量fixed4 B = tex2D(_BlendTex,i.uv); //B為混合圖rgba 四維向量//--------只更改這的代碼------------fixed4 C =A*(1-B.a)+B*(B.a); //正常透明度混合//---------------------------------// fixed4 C =A*(1-B.a)+B*(B.a); //正常透明度混合// fixed4 C =min(A,B); //變暗// fixed4 C =max(A,B); //變亮// fixed4 C =A*B ; //正片疊底// fixed4 C=1-((1-A)*(1-B));//濾色 A+B-A*B// fixed4 C =A-((1-A)*(1-B))/B; //顏色加深// fixed4 C= A+(A*B)/(1-B); //顏色減淡// fixed4 C=A+B-1;//線性加深// fixed4 C=A+B; //線性減淡// fixed4 ifFlag= step(A,fixed4(0.5,0.5,0.5,0.5));// fixed4 C=ifFlag*A*B*2+(1-ifFlag)*(1-(1-A)*(1-B)*2);//疊加// fixed4 ifFlag= step(B,fixed4(0.5,0.5,0.5,0.5));// fixed4 C=ifFlag*A*B*2+(1-ifFlag)*(1-(1-A)*(1-B)*2); //強光// fixed4 ifFlag= step(B,fixed4(0.5,0.5,0.5,0.5));// fixed4 C=ifFlag*(A*B*2+A*A*(1-B*2))+(1-ifFlag)*(A*(1-B)*2+sqrt(A)*(2*B-1)); //柔光// fixed4 ifFlag= step(B,fixed4(0.5,0.5,0.5,0.5));// fixed4 C=ifFlag*(A-(1-A)*(1-2*B)/(2*B))+(1-ifFlag)*(A+A*(2*B-1)/(2*(1-B))); //亮光// fixed4 ifFlag= step(B,fixed4(0.5,0.5,0.5,0.5)); //不知道為什么很多資料亮光效果都寫兩個min 實際效果還原應該是是一個min一個max// fixed4 C=ifFlag*(min(A,2*B))+(1-ifFlag)*(max(A,( B*2-1))); //點光 // fixed4 C=A+2*B-1; //線性光// fixed4 ifFlag= step(A+B,fixed4(1,1,1,1));// fixed4 C=ifFlag*(fixed4(0,0,0,0))+(1-ifFlag)*(fixed4(1,1,1,1)); //實色混合// fixed4 C=A+B-A*B*2; //排除// fixed4 C=abs(A-B); //差值// fixed4 ifFlag= step(B.r+B.g+B.b,A.r+A.g+A.b);// fixed4 C=ifFlag*(B)+(1-ifFlag)*(A); //深色// fixed4 ifFlag= step(B.r+B.g+B.b,A.r+A.g+A.b);// fixed4 C=ifFlag*(A)+(1-ifFlag)*(B); //淺色// fixed4 C=A-B; //減去// fixed4 C=A/B; //劃分return C;}ENDCGSubShader{Tags { "Queue"="Transparent" }Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fogENDCG}} }

項目源代碼:https://github.com/QinZhuo/ShaderLab
作者:琴卓
https://www.bilibili.com/read/cv1874791/
出處: bilibili

總結

以上是生活随笔為你收集整理的Unity Shader 颜色混合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。