首页 分享 Unity中Shader雾效的实现方法一

Unity中Shader雾效的实现方法一

来源:花匠小妙招 时间:2025-05-12 04:14

最新推荐文章于 2024-12-22 16:44:00 发布

楠溪泽岸 于 2023-11-13 00:02:06 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

文章目录 前言一、在片元着色器中使用如下公式计算`最终的颜色 = lerp(雾效颜色,物体颜色,雾效混合因子)`1、获取雾效颜色2、物体的颜色一般通过纹理采样得到,此处用 1 代替测试3、获取 雾效混合因子(由 雾的距离 和 雾的浓度决定) 二、在顶点着色器中,计算不同类型的雾效混合因子(在顶点着色器计算节省性能)Unity预定义好方便我们计算的四维变量 unity_FogParams1、计算线性雾的雾效混合因子2、计算指数雾1 的雾效混合因子3、计算指数雾2 的雾效混合因子 三、最终测试代码

前言

Unity中Shader雾效的实现方法一,按照之前的公式, 我们自己来实现一下

Unity中Shader雾效的原理

基于上一篇文章继续:

Unity中Shader的雾效

一、在片元着色器中使用如下公式计算

最终的颜色 = lerp(雾效颜色,物体颜色,雾效混合因子)

不管是什么类型的雾,这个雾效的公式都是统一的

1、获取雾效颜色

unity_FogColor

2、物体的颜色一般通过纹理采样得到,此处用 1 代替测试

3、获取 雾效混合因子(由 雾的距离 和 雾的浓度决定)

雾效混合因子是由,之前的三个雾效衰减公式计算得到的

Unity中Shader雾效的原理

因为在片元着色器中计算雾效需要使用该因子
所以在 v2f 中定义一个 TEXCOORD 类型的 float 变量 fogFactor

float fogFactor : TEXCOORD1;

二、在顶点着色器中,计算不同类型的雾效混合因子(在顶点着色器计算节省性能)

Unity预定义好方便我们计算的四维变量 unity_FogParams

在这里插入图片描述

1、计算线性雾的雾效混合因子

在这里插入图片描述

获取 z :这个z是摄像机到物体的距离
z = (用摄像机的世界坐标 - 顶点的世界坐标)的 模长
计算需要准备:
摄像机的世界坐标:_WorldSpaceCameraPos
顶点的世界坐标:mul(unity_ObjectToWorld,v.vertex)

float z = length(_WorldSpaceCameraPos - worldPos);

获取 start 和 end
上面的公式可以等价为:
fogFactor
= (end - z) / (end - start)
= (end / (end - start)) + z * (-1 / (end - start))
使用Unity预定义的公式后:
= unity_FogParams.w + z * unity_FogParams.z ;

//(end - z) / (end - start)= (end / (end - start)) + z * (-1 / (end - start))
o.fogFactor = z * unity_FogParams.z + unity_FogParams.w;

效果:
请添加图片描述

2、计算指数雾1 的雾效混合因子

在这里插入图片描述

fogFactor
= exp2(-density * z)
使用Unity预定义的公式后:
= exp2(-unity_FogParams.y * z)

//exp2(-density * z)
o.fogFactor = exp2(-unity_FogParams.y * z);

效果:
请添加图片描述

3、计算指数雾2 的雾效混合因子

在这里插入图片描述
fogFactor
= exp2(-(density * z)^2)
使用Unity预定义的公式后:
= exp2(-(unity_FogParams.x * z)^2)

//exp2(-(density * z)^2)
float density = unity_FogParams.x * z;
o.fogFactor = exp2(-density * density);

效果:
请添加图片描述

三、最终测试代码

//unity的雾效 //雾效的实现方法一 Shader "MyShader/P1_9_3" { 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; float fogFactor : TEXCOORD1; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); float4 worldPos = mul(unity_ObjectToWorld,v.vertex); float z = length(_WorldSpaceCameraPos - worldPos); #if defined(FOG_LINEAR) //(end - z) / (end - start)= (end / (end - start)) + z * (-1 / (end - start)) o.fogFactor = z * unity_FogParams.z + unity_FogParams.w; #elif defined(FOG_EXP) //exp2(-density * z) o.fogFactor = exp2(-unity_FogParams.y * z); #elif defined(FOG_EXP2) //exp2(-(density * z)^2) float density = unity_FogParams.x * z; o.fogFactor = exp2(-density * density); #endif return o; } fixed4 frag (v2f i) : SV_Target { fixed4 c = 0; #if defined(FOG_LINEAR) || defined(FOG_EXP) || defined(FOG_EXP2) c = lerp(unity_FogColor,c,i.fogFactor); #endif return c; } ENDCG } } }

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

相关知识

Unity Shader 之 环境光
unity 白色材质曝光过曝
无光照可调节透明通道Shader(unity3d)
unity 渲染环境设置
Unity中的部分环境光照设置以及简单雾的效果
【Unity 天气系统插件】Enviro 3
Made with Unity
基于Unity 3D果树交互虚拟修剪技术及其实现
Unity程序化生成花朵插件教程:《Unity中的动态花卉生成》
江苏园林雾景打造,震撼雾效,新颖水造雾,园林景观**

网址: Unity中Shader雾效的实现方法一 https://www.huajiangbk.com/newsview1934657.html

所属分类:花卉
上一篇: 舞台雾效设备专家
下一篇: 一种全新的舞台造雾手法“雾森系统

推荐分享