网站建设开票属于哪个名称,三乡网站开发,本溪北京网站建设,响应式网站建设代理问题背景
恐怖游戏在黑夜或者某些场景下#xff0c;需要用雾或者黑暗遮盖视野#xff0c;搭建游戏氛围
效果
场景中#xff0c;雾会遮挡场景和怪物#xff0c;但是在玩家视野内雾会消散#xff0c;距离玩家越近雾越薄。
当前是第三人称视角#xff0c;但是可以轻松的…问题背景
恐怖游戏在黑夜或者某些场景下需要用雾或者黑暗遮盖视野搭建游戏氛围
效果
场景中雾会遮挡场景和怪物但是在玩家视野内雾会消散距离玩家越近雾越薄。
当前是第三人称视角但是可以轻松的把这个效果转换为第一人称视角。 原理
正如屏幕空间的高度雾这里做一个屏幕空间的视野雾。
采用特殊的材质在相机前方绘制一个能遮盖相机的矩形。如果矩形覆盖的像素点在视野内就降低雾效果否则绘制雾效果。
实现
urp下使用RenderFeature 自定义shader实现
简略步骤
在相机节点下放置一个Plane隐藏它 编写shader并创建材质
像素着色器代码如下原理为采样深度根据深度计算出当前像素的世界坐标根据坐标和玩家位置的关系确定雾效果 float4 frag(Varyings input) : SV_Target{UNITY_SETUP_INSTANCE_ID(input);UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input);//计算屏幕uvfloat2 screenUV GetNormalizedScreenSpaceUV(input.positionCS);//采样深度#if UNITY_REVERSED_Zfloat depth SampleSceneDepth(screenUV);#else// Adjust Z to match NDC for OpenGL ([-1, 1])float depth lerp(UNITY_NEAR_CLIP_VALUE, 1, SampleSceneDepth(screenUV));#endif//根据深度计算当前像素所代表的世界空间坐标float3 worldPos ComputeWorldSpacePosition(screenUV, depth, UNITY_MATRIX_I_VP);//计算角色位置和当前渲染的像素所代表的世界坐标的距离float distanceVal distance(worldPos, _PosWS);//做过渡float t (max(distanceVal - (_Range * 0.8), 0)) / (_Range * 1.2);//计算透明度透明度越低雾越薄float alpha lerp(0, 1, saturate(t * t));//返回像素颜色return float4(_Color.rgb, alpha * _Color.a);}
创建并且配置RenderFeature到URP管线的自定义Renderer 自定义Pass中的核心代码使用指定的材质绘制隐藏的Plane public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){if(null Renderer){if(null ! SceneFogController.Instance){Renderer SceneFogController.Instance.Renderer;}}if (null FogMat || null Renderer){return;}var cmd CommandBufferPool.Get(FogPass);cmd.DrawRenderer(Renderer, FogMat, 0, 0);//Matrix4x4 material new Matrix4x4();//material.SetTRS(_renderer.transform.position, _renderer.transform.rotation, Vector3.one);//cmd.DrawMesh(_renderer.gameObject.GetComponentMeshFilter().sharedMesh, material, FogMat);context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}