本来想写一下伽马空间,hdr应用的
最近时间似乎抓不住了
挖的坑越来越多
还是先写简单的Bloom
光辉效果几乎是每个游戏都要用到的
大概就是阳光明媚的中午,太阳穿过树叶,你此时抬头看,树叶跟光的那种效果
有一种实现思路是把高斯模糊跟原色做一个简单的加法
当然可能会觉得太亮了
可以直接乘个系数,或者修改原色的亮度
亮度公式0.2125 * color.r + 0.7154 * color.g + 0.0721 * color.b
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class BloomTest : MonoBehaviour
{
public Shader shader;
private Material _mat;
void OnEnable()
{
_mat = new Material(shader);
}
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
if (_mat == null)
return;
RenderTexture rt0 = RenderTexture.GetTemporary(src.width / 2, src.height / 2);
RenderTexture rt1 = RenderTexture.GetTemporary(src.width / 2, src.height / 2);
Graphics.Blit(src, rt0);
for (int i=0;i<3;i++)
{
Graphics.Blit(rt0,rt1, _mat, 0);
Graphics.Blit(rt1,rt0, _mat, 1);
}
_mat.SetTexture("_BlurTex", rt0);
Graphics.Blit(rt0, dest, _mat, 2);
RenderTexture.ReleaseTemporary(rt0);
RenderTexture.ReleaseTemporary(rt1);
}
}
Shader "Test/Unity Shaders Book/Chapter 12/BloomTest"
{
Properties
{
_MainTex("MainTex",2D)="white"{}
_BlurTex("BlurTex",2D)="white"{}
}
SubShader
{
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _MainTex;
sampler2D _BlurTex;
struct a2vBloom
{
float4 pos:POSITION;
half2 uv:TEXCOORD0;
};
struct v2fBloom
{
float4 pos:SV_POSITION;
half2 uv:TEXCOORD0;
};
v2fBloom vertBloom(a2vBloom v)
{
v2fBloom o;
o.pos = UnityObjectToClipPos(v.pos);
o.uv = v.uv;
return o;
}
fixed4 fragBloom(v2fBloom f):SV_TARGET
{
fixed4 o;
o = tex2D(_MainTex,f.uv)+tex2D(_BlurTex,f.uv);
return o;
}
ENDCG
//unity可以直接引用在其他文件里的pass代码
UsePass "Unity Shaders Book/Chapter 12/Gaussian Blur/GAUSSIAN_BLUR_VERTICAL"
UsePass "Unity Shaders Book/Chapter 12/Gaussian Blur/GAUSSIAN_BLUR_HORIZONTAL"
Pass
{
CGPROGRAM
#pragma vertex vertBloom
#pragma fragment fragBloom
ENDCG
}
}
}
这个系列主要是通过阅读《Unity Shader入门精要》之后的一些感想,给读者一些启发。
联系邮箱:glasirius@gmail.com