混色部方程式モデルは以下の通りであります:
非常に実用的なフェルト、効果を確認しようとするシェーダを書きます。
混合モードがあるので、次の2枚の画像を必要とするが、私たちはカメラの内容に対処した後、一層のみ、ので、私はAとBに対処するために同じコンテンツを使用し、両方置きます。
明らかに同じ内容AとB層は、その後、最初の2つの式と確かに暗く変数が有効でない、のは、第三式を試してみましょう。
まず、このようなシェーダ、への式:
//乗算
fixed4 Muitiply(fixed4 _color) {
固定されたR = POW(。_color R、2)。
固定G = POW(_color。G、2)。
固定されたB = POW(_color。B、2)。
戻りfixed4(R、G、B、1.0 F)。
}
カラー値における当社のシェーダが0-1である一方で、我々は0-1の色の値の範囲を取得するために255で割った式中のすべての色の値をしたいので、式の画像のカラー値は、0〜255に基づいて算出されています。変換後、上記式中のコードは、ルックなります。
_colorピクセルは、各ピクセルのRGB値が算出され、透明性がここで考慮されていない、直接1.0を充填することができます。
結果を見てください:
第一は、元である、第二の乗算でPhotoshopの効果であり、第三は、我々はの結束で効果を確認することです。
あなたがPhotoshopや基本的には同じで得られた結果で団結を見ることができる、のは、再び別の式を試してみましょう。
次のように私たちは色を見て、この時間は、対応するシェーダコードは次のようになります。
//色
fixed4 画面(fixed4 _color) {
固定されたR = 1 - (POW((1 - _color。R)、2))。
固定G = 1 - (POW((1 - _color。G)、2))。
固定されたB = 1 - (POW((1 - _color。B)、2))。
戻りfixed4(R、G、B、1.0 F)。
}
效果图:
效果也基本一致,看来我们的思路是正确的,这样看来上面图片中给出的那些公式我们都可以正常使用。
这里我们只是对一张图片做了处理,我们看一下应用在场景里的效果:
经过处理后场景感觉更明亮一些,除了上面图片中的公式,其实还有一个比较常用的,就是去色,像王者荣耀里面玩家死亡后的效果,只要知道了公式实现起来也是非常简单的,我们只要让rgb各自都取它们的平均值就可以了,像这样:
fixed4 DelColor(fixed4 _color){
fixed c = _color.r + _color.g + _color.b;
c /= 3;
return fixed4(c,c,c,1.0f);
}
效果:
好了,按照惯例上完整代码
shader内容:
Shader "Custom/ColorCompute" {
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
Pass{
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert_img
#pragma fragment frag
uniform sampler2D _MainTex;
//去色
fixed4 DelColor(fixed4 _color){
fixed c = _color.r + _color.g + _color.b;
c /= 3;
return fixed4(c,c,c,1.0f);
}
//曝光
21
fixed4 Exposure(fixed4 _color,fixed force){
22
fixed r = min(1,max(0,_color.r * pow(2,force)));
23
fixed g = min(1,max(0,_color.g * pow(2,force)));
24
fixed b = min(1,max(0,_color.b * pow(2,force)));
25
return fixed4(r,g,b,1.0f);
26
}
27
//颜色加深
28
fixed4 ColorPlus(fixed4 _color){
29
fixed r = 1-(1-_color.r)/_color.r;
30
fixed g = 1-(1-_color.g)/_color.g;
31
fixed b = 1-(1-_color.b)/_color.b;
32
return fixed4(r,g,b,1.0f);
33
}
34
//颜色减淡
35
fixed4 ColorMinus(fixed4 _color){
36
fixed r = _color.r + pow(_color.r,2)/(1-_color.r);
37
fixed g = _color.g + pow(_color.g,2)/(1-_color.g);
38
fixed b = _color.b + pow(_color.b,2)/(1-_color.b);
39
return fixed4(r,g,b,1.0f);
40
}
41
//滤色
42
fixed4 Screen(fixed4 _color){
43
fixed r = 1-(pow((1-_color.r),2));
44
fixed g = 1-(pow((1-_color.g),2));
45
fixed b = 1-(pow((1-_color.b),2));
46
return fixed4(r,g,b,1.0f);
47
}
48
//正片叠底
49
fixed4 Muitiply(fixed4 _color){
50
fixed r = pow(_color.r,2);
51
fixed g = pow(_color.g,2);
52
fixed b = pow(_color.b,2);
53
return fixed4(r,g,b,1.0f);
54
}
55
//强光
56
fixed4 ForceLight(fixed4 _color){
57
fixed r = 1-pow((1-_color.r),2) / 0.5f;
58
fixed g = 1-pow((1-_color.g),2) / 0.5f;
59
fixed b = 1-pow((1-_color.b),2) / 0.5f;
60
if(_color.r < 0.5f) r = pow(_color.r,2)/0.5f;
61
if(_color.g < 0.5f) g = pow(_color.g,2)/0.5f;
62
if(_color.b < 0.5f) b = pow(_color.b,2)/0.5f;
63
return fixed4(r,g,b,1.0f);
64
}
65
float4 frag( v2f_img o ) : COLOR
66
{
67
fixed4 _color = tex2D(_MainTex, o.uv);
68
_color = DelColor(_color);
69
return _color;
70
}
71
ENDCG
72
}
73
}
74
FallBack "Diffuse"
75
}
摄像机脚本:
1
[ExecuteInEditMode]
2
public class ColorCompute : MonoBehaviour {
3
public Material m;
4
空OnRenderImage(テクスチャレンダリング、SRCをテクスチャレンダリングDESTを)
5
{
6
グラフィックス。ブリット(SRC、DEST、M)。
7
}
8
}