计算机图形学 Unity ShaderLab 颜色混合运算相关计算方法
本文使用shader語法
已知顏色A與顏色B,顏色B覆蓋在顏色A上,最終輸出的結果為顏色C。
A為緩存色,B為當前色,C為輸出色
【正常透明度混合】-
描述:正常透明度混合
公式:當前顏色 x 當前透明度 +(1 - 當前透明度)x 緩存顏色
shader:fixed4 C = B x B.a + A x (1 - B.a);
【正片疊底】-
描述:顏色疊加,使像素重合部分的顏色更暗。像素覆蓋順序隨意調換不會改變結果
公式:當前顏色 x 緩存顏色
shader:fixed4 C = A * B;
【濾色】-
描述:與正片疊底相反,重合部分的像素更亮
公式:1 - (1-當前顏色)x (1-緩存顏色)
shader代碼:fixed4 C = 1 - (1 - A) * (1 - B);
【疊加】 - -
描述:結合濾色與正片疊底,基色的像素重合部分比較亮的會更亮,比較暗的會跟暗
公式:如果當前顏色 <= 0.5 返回1,否則返回 0 該值記做 w;
w x 緩存色 x 當前色 x 2 + (1 - w) x (1 - (1 - 緩存色) x (1 - 當前色) x 2)
shader代碼:
if(A > 0.5){
fixed4 C = 1 - 2 * (1 - A) * (1 - B);
}else{
fixed4 C = 2AB;
}
【反色】
描述:取得與緩存色相反的顏色
公式:1 - 緩存顏色
shader代碼:fixed4 C = 1 - A;
【變暗】-
描述:緩存顏色 x 緩存顏色與當前顏色中最小的那個
公式:緩存顏色 x min(緩存顏色,當前顏色)
shader代碼:fixed4 C =A * min(A,B) ;
【變亮】-
描述:緩存顏色 x 緩存顏色與當前顏色中最大的那個
公式:緩存顏色 x max(緩存顏色,當前顏色)
shader代碼:
fixed4 C =A * max(A, B) ;
【減色】
描述:緩存顏色減掉當前顏色的值
公式:緩存顏色 - 當前顏色
shader代碼:fixed4 C = A - B;
【劃分】
描述:緩存顏色除當前顏色的值
公式:緩存顏色 / 當前顏色
shader代碼: fixed4 C = A / B ;
【顏色加深】
描述:
公式:緩存顏色 - ((1 - 緩存顏色) x (1 - 當前顏色)) / 緩存顏色
shader代碼:fixed4 C = A - ((1-A) * (1-B)) / B;
【顏色減淡】
描述:
公式:緩存顏色 + ((緩存顏色 x 當前顏色) / (1 - 當前顏色))
shader代碼:fixed4 C = A + (A * B) / (1 - B);
【線性加深】
描述:
公式:當前顏色 + 緩存顏色 - 1
shader代碼:fixed4 C = B + A -1;
【線性減淡】
描述:
公式:緩存顏色 + 當前顏色
shader代碼:fixed4 C = A + B;
【強光】
描述:
公式:如果當前色 <= 0.5 返回1,否則返回0,記作w;
w x 緩存色 x 當前色 x 2 + (1 - w) x (1 - (1 - 緩存色) x (1 - 當前色) x 2);
shader代碼:
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);
【柔光】
描述:
公式:如果當前色 <= 0.5 返回1,否則返回0,記作w;
w x 緩存色 x 當前色 x 2 + (1 - w) x (1 - (1 - 緩存色) x (1 - 當前色) x 2);
shader代碼:
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));
【亮光】
描述:
公式:如果當前色 <= 0.5 返回1,否則返回0,記作w;
w x (緩存色 - (1 - 緩存色) x (1 - 2 x 當前色) / (2 x 當前色)) + (1 - w) x (緩存色 + 緩存色 x (2 x 當前色 - 1) / (2 x (1 - 當前色)));
shader代碼:
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)));
【點光】
描述:
公式:如果當前色 <= 0.5 返回1,否則返回0,記作w;
w x (min(緩存色, 2 x 當前色)) + (1 - w) x (max(緩存色, ( 當前色 x 2 - 1)));
shader代碼:
fixed4 ifFlag = step(B, fixed4(0.5, 0.5, 0.5, 0.5));
fixed4 C = ifFlag * (min(A, 2 * B)) + (1 - ifFlag) * (max(A, ( B * 2 - 1)));
【線性光】
描述:
公式:緩存色,+ 2 x 當前色 - 1;
shader代碼: fixed4 C=A+2*B-1;
【實色混合】
描述:
公式:如果當前色 + 緩存色 <= 1 返回1,否則返回0,記作w;
w x (0) + (1 - w) x (1);
shader代碼:
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));
【深色】
描述:
公式:如果當前色的rgb分量 + 緩存色 <= 1 返回1,否則返回0,記作w;
w x (0) + (1 - w) x (1);
shader代碼:
fixed4 ifFlag = step(B.r + B.g + B.b, A.r + A.g + A.b);
fixed4 C = ifFlag * (B) + (1-ifFlag)*(A);
顏色制式
RGBA :紅、綠、藍、透明度
HSL: hue(色相)、saturation(飽和度)、lightness(亮度)
HSV: hue(色相)、saturation(飽和度)、value(色調)
HSB: hue(色相)、saturation(飽和度)、brightness(明度)
顏色轉換
參考文章 https://www.bilibili.com/read/cv1874791/ 該文章有預覽圖挺不錯的
總結
以上是生活随笔為你收集整理的计算机图形学 Unity ShaderLab 颜色混合运算相关计算方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚拟机中Ubuntu设置共享文件夹
- 下一篇: Spring Security Web