У меня есть шейдер рендеринга в облаке на Unity, который использует 3d-шум и лучевую метку. Это фрагментный шейдер на весь экран, основанный на этом уроке: https://www.youtube.com/watch?v=4QOcCGI6xOU
В настоящее время я освещаю облака, используя еще больше лучевых меток. У меня есть две проблемы с этим, во-первых, это дорого, во-вторых, мои облака не отбрасывают тени.
Я хочу, в основном, сказать Unity писать в динамическую c карту освещения и использовать ее для прекратить световой марш, если я знаю, что я тень облака.
У меня мало идей о том, как это сделать, за исключением смутного, что добавление теневого прохода в шейдер скажет единство, чтобы сделать это.
Вот моя текущая структура кода, за исключением очень длинного кода 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
}
}
}