文章目录
- 前言
- 一、声明雾效所需要的内置变体
- 二、在 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}}
}