Сделайте объемный облачный шейдер, отбрасывающий тени
У меня есть шейдер облачного рендеринга в Unity, который использует 3D-шум и raymarching. Это фрагментарный шейдер для всего экрана, основанный на этом руководстве: https://www.youtube.com/watch?v=4QOcCGI6xOU
В настоящее время я освещаю облака, используя еще больше реймарчинга. У меня с этим две проблемы: во-первых, это дорого, во-вторых, мои облака не отбрасывают тени.
Я хочу в основном сказать Unity, что нужно писать в динамическую карту освещения и использовать ее, чтобы прервать марширование света, если я знаю, что я тень облака.
Я плохо представляю, как это сделать, за исключением того, что добавление прохода тени в шейдер скажет Unity сделать это.
Вот моя текущая структура кода без очень длинного кода raymarching:
Shader "Jupiter/Clouds"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Assets/Scripts/Clouds/Shaders/CloudDebug.cginc"
// vertex input: position, UV
struct appdata {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float3 viewVector : TEXCOORD1;
};
v2f vert (appdata v) {
v2f output;
output.pos = UnityObjectToClipPos(v.vertex);
output.uv = v.uv;
// Camera space matches OpenGL convention where cam forward is -z. In unity forward is positive z.
// (https://docs.unity3d.com/ScriptReference/Camera-cameraToWorldMatrix.html)
float3 viewVector = mul(unity_CameraInvProjection, float4(v.uv * 2 - 1, 0, -1));
output.viewVector = mul(unity_CameraToWorld, float4(viewVector,0));
return output;
}
// Textures
Texture3D<float4> NoiseTex;
Texture3D<float4> DetailNoiseTex;
Texture2D<float4> WeatherMap;
Texture2D<float4> BlueNoise;
SamplerState samplerNoiseTex;
SamplerState samplerDetailNoiseTex;
SamplerState samplerWeatherMap;
SamplerState samplerBlueNoise;
sampler2D _MainTex;
sampler2D _CameraDepthTexture;
//tons of parameters
float4 frag (v2f i) : SV_Target
{
//blablabla
return float4(col,0);
}
ENDCG
}
}
}