文章目录
- 前言
- 一、声明雾效所需要的内置变体
- 二、在 v2f 中声明顶点传入片段中的雾效插值器
- 三、 在顶点着色器中计算雾效采样
- 四、在片元着色器中进行雾效颜色混合
- 在这里插入图片描述
- 五、最终效果
前言
Unity中雾效的实现方法二,使用 Unity 自带的方法实现,这次使用的是最通用的雾效方法
常规方案
- 1.#pragma multi_compile_fog声明雾效所需要的内置变体:FOG_LINEAR FOG_EXP FOG_EXP2.
- 2.UNITY_FOG_COORDS(idx): 声明顶点传入片断中的雾效插值器(fogCoord).
- 3.UNITY_TRANSFER_FOG(o,o.vertex): 在顶点着色器中计算雾效采样.
- 4.UNITY_APPLY_FOG(i.fogCoord, col): 在片断着色器中进行雾效颜色混合.
一、声明雾效所需要的内置变体
#pragma multi_compile_fog
二、在 v2f 中声明顶点传入片段中的雾效插值器
UNITY_FOG_COORDS(1)
我们来看Unity源码,了解这段代码干了什么?
三、 在顶点着色器中计算雾效采样
UNITY_TRANSFER_FOG(o,o.vertex);
我们来看Unity源码,了解这段代码干了什么?
雾效混合因子的计算使用的公式是之前的公式:
- Unity中Shader雾效的实现方法一
四、在片元着色器中进行雾效颜色混合
UNITY_APPLY_FOG(i.fogCoord, col);
我们来看 雾效颜色混合 在Unity中的源码:
五、最终效果
最终测试代码:
//unity的雾效
//雾效的实现方法一
Shader "MyShader/P1_9_4"
{
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
UNITY_FOG_COORDS(1)
};
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = 0;
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}