mirror of
https://github.com/maxartz15/VolumetricLighting.git
synced 2024-11-09 16:52:57 +01:00
Dir light test
This commit is contained in:
parent
20c2847d23
commit
f153209bbc
@ -79,7 +79,7 @@ public partial class FogLight : LightOverride
|
|||||||
if (temp == null || temp.Length != downsampleSteps - 1)
|
if (temp == null || temp.Length != downsampleSteps - 1)
|
||||||
temp = new int[downsampleSteps - 1];
|
temp = new int[downsampleSteps - 1];
|
||||||
|
|
||||||
for (int i = 0, currentRes = startRes/2; i < downsampleSteps; i++)
|
for (int i = 0, currentRes = startRes / 2; i < downsampleSteps; i++)
|
||||||
{
|
{
|
||||||
m_BufGrabShadowmap.SetGlobalVector("_TexelSize", new Vector4(0.5f/currentRes, 0.5f/currentRes, 0, 0));
|
m_BufGrabShadowmap.SetGlobalVector("_TexelSize", new Vector4(0.5f/currentRes, 0.5f/currentRes, 0, 0));
|
||||||
|
|
||||||
@ -113,10 +113,17 @@ public partial class FogLight : LightOverride
|
|||||||
currentRes /= 2;
|
currentRes /= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
//var directionalShadowmapBlurred = Shader.PropertyToID("_DirectionalShadowmapBlurred");
|
RenderTexture blur = RenderTexture.GetTemporary(targetRes, targetRes, 0, format, RenderTextureReadWrite.Linear);
|
||||||
//m_BufGrabShadowmap.GetTemporaryRT(directionalShadowmapBlurred, 1024, 1024, 0, FilterMode.Bilinear, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear);
|
m_BufGrabShadowmap.SetGlobalVector("_TexelSize", new Vector4(1.0f / targetRes, 1.0f / targetRes, 0, 0));
|
||||||
//m_BufGrabShadowmap.Blit(shadowmap, m_Shadowmap);
|
m_BufGrabShadowmap.SetGlobalFloat("_BlurSize", m_BlurSize);
|
||||||
//m_BufGrabShadowmap.SetGlobalTexture(directionalShadowmapBlurred, directionalShadowmapBlurred);
|
|
||||||
|
for (int i = 0; i < m_BlurIterations; i++)
|
||||||
|
{
|
||||||
|
m_BufGrabShadowmap.Blit(m_Shadowmap, blur, m_BlurShadowmapMaterial, 2);
|
||||||
|
m_BufGrabShadowmap.Blit(blur, m_Shadowmap, m_BlurShadowmapMaterial, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
blur.Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Vector4 GetZParams()
|
private Vector4 GetZParams()
|
||||||
|
@ -74,6 +74,13 @@ public class VolumetricFog : MonoBehaviour
|
|||||||
[Range(0.0f, 1.0f)]
|
[Range(0.0f, 1.0f)]
|
||||||
public float m_Z = 1.0f;
|
public float m_Z = 1.0f;
|
||||||
|
|
||||||
|
[SerializeField]
|
||||||
|
private float m_dirLightOffset;
|
||||||
|
[SerializeField]
|
||||||
|
private float m_vsmBias;
|
||||||
|
[SerializeField]
|
||||||
|
private float m_dirBias;
|
||||||
|
|
||||||
struct PointLightParams
|
struct PointLightParams
|
||||||
{
|
{
|
||||||
public Vector3 pos;
|
public Vector3 pos;
|
||||||
@ -292,7 +299,9 @@ public class VolumetricFog : MonoBehaviour
|
|||||||
m_dirLightDir[1] = dir.y;
|
m_dirLightDir[1] = dir.y;
|
||||||
m_dirLightDir[2] = dir.z;
|
m_dirLightDir[2] = dir.z;
|
||||||
m_InjectLightingAndDensity.SetFloats("_DirLightDir", m_dirLightDir);
|
m_InjectLightingAndDensity.SetFloats("_DirLightDir", m_dirLightDir);
|
||||||
|
m_InjectLightingAndDensity.SetFloat("_DirLightOffset", m_dirLightOffset);
|
||||||
|
m_InjectLightingAndDensity.SetFloat("_VSMBias", m_vsmBias);
|
||||||
|
m_InjectLightingAndDensity.SetFloat("_DirBias", m_dirBias);
|
||||||
}
|
}
|
||||||
|
|
||||||
float[] m_fogParams;
|
float[] m_fogParams;
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
Shader "Hidden/ApplyToOpaque" {
|
Shader "Hidden/ApplyToOpaque" {
|
||||||
SubShader {
|
SubShader {
|
||||||
Pass {
|
Pass {
|
||||||
ZTest Always Cull Off ZWrite Off
|
ZTest Always Cull Off ZWrite Off
|
||||||
Blend Off
|
Blend Off
|
||||||
|
|
||||||
CGPROGRAM
|
CGPROGRAM
|
||||||
#pragma target 3.0
|
#pragma target 3.0
|
||||||
#include "UnityCG.cginc"
|
#include "UnityCG.cginc"
|
||||||
#include "VolumetricFog.cginc"
|
#include "VolumetricFog.cginc"
|
||||||
@ -20,7 +20,7 @@ CGPROGRAM
|
|||||||
float2 uv : TEXCOORD0;
|
float2 uv : TEXCOORD0;
|
||||||
};
|
};
|
||||||
|
|
||||||
v2f vert (appdata_img v)
|
v2f vert(appdata_img v)
|
||||||
{
|
{
|
||||||
v2f o;
|
v2f o;
|
||||||
o.pos = v.vertex;
|
o.pos = v.vertex;
|
||||||
@ -29,20 +29,22 @@ CGPROGRAM
|
|||||||
|
|
||||||
#if UNITY_UV_STARTS_AT_TOP
|
#if UNITY_UV_STARTS_AT_TOP
|
||||||
if (_ProjectionParams.x < 0)
|
if (_ProjectionParams.x < 0)
|
||||||
o.uv.y = 1-o.uv.y;
|
o.uv.y = 1 - o.uv.y;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
half4 frag (v2f i) : SV_Target
|
half4 frag(v2f i) : SV_Target
|
||||||
{
|
{
|
||||||
|
//return half4(i.uv, 0, 1);
|
||||||
|
|
||||||
half linear01Depth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv));
|
half linear01Depth = Linear01Depth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv));
|
||||||
half4 fog = Fog(linear01Depth, i.uv);
|
half4 fog = Fog(linear01Depth, i.uv);
|
||||||
return tex2D(_MainTex, i.uv) * fog.a + fog;
|
return tex2D(_MainTex, i.uv) * fog.a + fog;
|
||||||
}
|
}
|
||||||
|
|
||||||
ENDCG
|
ENDCG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -130,7 +130,7 @@ Shader "Hidden/BlurShadowmap" {
|
|||||||
struct v2f
|
struct v2f
|
||||||
{
|
{
|
||||||
float4 pos : SV_POSITION;
|
float4 pos : SV_POSITION;
|
||||||
half4 uv : TEXCOORD0;
|
half2 uv : TEXCOORD0;
|
||||||
half2 offs : TEXCOORD1;
|
half2 offs : TEXCOORD1;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -139,9 +139,11 @@ Shader "Hidden/BlurShadowmap" {
|
|||||||
v2f vertBlurHorizontal (appdata_img v)
|
v2f vertBlurHorizontal (appdata_img v)
|
||||||
{
|
{
|
||||||
v2f o;
|
v2f o;
|
||||||
o.pos = v.vertex;
|
|
||||||
|
|
||||||
o.uv = half4(v.texcoord.xy,1,1);
|
o.pos = UnityObjectToClipPos(v.vertex);
|
||||||
|
//o.pos = v.vertex;
|
||||||
|
|
||||||
|
o.uv = v.texcoord;
|
||||||
o.offs = _TexelSize.xy * half2(1.0, 0.0) * _BlurSize;
|
o.offs = _TexelSize.xy * half2(1.0, 0.0) * _BlurSize;
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
@ -150,16 +152,19 @@ Shader "Hidden/BlurShadowmap" {
|
|||||||
v2f vertBlurVertical (appdata_img v)
|
v2f vertBlurVertical (appdata_img v)
|
||||||
{
|
{
|
||||||
v2f o;
|
v2f o;
|
||||||
o.pos = v.vertex;
|
|
||||||
|
|
||||||
o.uv = half4(v.texcoord.xy, 1, 1);
|
o.pos = UnityObjectToClipPos(v.vertex);
|
||||||
|
//o.pos = v.vertex;
|
||||||
|
|
||||||
|
o.uv = v.texcoord;
|
||||||
o.offs = _TexelSize.xy * half2(0.0, 1.0) * _BlurSize;
|
o.offs = _TexelSize.xy * half2(0.0, 1.0) * _BlurSize;
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
float4 fragBlur8 (v2f i) : SV_Target
|
float4 fragBlur8(v2f i) : SV_Target
|
||||||
{
|
{
|
||||||
|
//half2 coords = i.uv.xy;
|
||||||
half2 coords = i.uv.xy - i.offs * 5.0;
|
half2 coords = i.uv.xy - i.offs * 5.0;
|
||||||
|
|
||||||
float4 color = 0;
|
float4 color = 0;
|
||||||
|
@ -33,6 +33,10 @@ float3 _DirLightDir;
|
|||||||
#ifdef DIR_LIGHT_SHADOWS
|
#ifdef DIR_LIGHT_SHADOWS
|
||||||
float _DirLightShadows;
|
float _DirLightShadows;
|
||||||
float _ESMExponentDirLight;
|
float _ESMExponentDirLight;
|
||||||
|
float _DirLightOffset;
|
||||||
|
float _VSMBias;
|
||||||
|
float _DirBias;
|
||||||
|
|
||||||
struct ShadowParams
|
struct ShadowParams
|
||||||
{
|
{
|
||||||
float4x4 worldToShadow[4];
|
float4x4 worldToShadow[4];
|
||||||
@ -258,7 +262,6 @@ float ChebyshevUpperBound(float2 moments, float mean)
|
|||||||
{
|
{
|
||||||
// Compute variance
|
// Compute variance
|
||||||
float variance = moments.y - (moments.x * moments.x);
|
float variance = moments.y - (moments.x * moments.x);
|
||||||
float _VSMBias = 0.001f;
|
|
||||||
variance = max(variance, _VSMBias * mean * mean);
|
variance = max(variance, _VSMBias * mean * mean);
|
||||||
|
|
||||||
// Compute probabilistic upper bound
|
// Compute probabilistic upper bound
|
||||||
@ -298,12 +301,19 @@ float3 DirectionalLight(float3 pos)
|
|||||||
if (_DirLightShadows > 0.0)
|
if (_DirLightShadows > 0.0)
|
||||||
{
|
{
|
||||||
float4 cascadeWeights = getCascadeWeights_splitSpheres(pos);
|
float4 cascadeWeights = getCascadeWeights_splitSpheres(pos);
|
||||||
float4 samplePos = getShadowCoord(pos, cascadeWeights).xyzw;
|
|
||||||
|
float3 spos = pos + (_DirLightDir * _DirLightOffset);
|
||||||
|
|
||||||
|
float4 samplePos = getShadowCoord(spos, cascadeWeights).xyzw;
|
||||||
//---
|
//---
|
||||||
//att *= _DirectionalShadowmap.SampleLevel(sampler_DirectionalShadowmap, samplePos.xy, 0).r < samplePos.z;
|
//att *= _DirectionalShadowmap.SampleLevel(sampler_DirectionalShadowmap, samplePos.xy, 0).r < samplePos.z;
|
||||||
//---
|
//---
|
||||||
float2 shadowmap = _DirectionalShadowmap.SampleLevel(sampler_DirectionalShadowmap, samplePos.xy, 0).xy;
|
float2 shadowmap = _DirectionalShadowmap.SampleLevel(sampler_DirectionalShadowmap, samplePos.xy, 0).xy;
|
||||||
att *= ChebyshevUpperBound(shadowmap.xy, samplePos.z / samplePos.w);
|
float shadow = ChebyshevUpperBound(shadowmap.xy, samplePos.z / samplePos.w);
|
||||||
|
|
||||||
|
shadow = saturate(lerp(shadow, 1.0, _DirBias));
|
||||||
|
|
||||||
|
att = shadow;
|
||||||
//---
|
//---
|
||||||
//float depth = exp(-40.0 * samplePos.z);
|
//float depth = exp(-40.0 * samplePos.z);
|
||||||
//att = saturate(shadowmap.r * depth);
|
//att = saturate(shadowmap.r * depth);
|
||||||
|
@ -29,6 +29,6 @@ half4 Fog(half linear01Depth, half2 screenuv)
|
|||||||
return half4(0, 0, 0, 1);
|
return half4(0, 0, 0, 1);
|
||||||
|
|
||||||
half3 uvw = half3(screenuv.x, screenuv.y, z);
|
half3 uvw = half3(screenuv.x, screenuv.y, z);
|
||||||
uvw.xy += cellNoise(uvw.xy * _Screen_TexelSize.zw) * _VolumeScatter_TexelSize.xy * 0.8;
|
//uvw.xy += cellNoise(uvw.xy * _Screen_TexelSize.zw) * _VolumeScatter_TexelSize.xy * 0.8;
|
||||||
return tex3D(_VolumeScatter, uvw);
|
return tex3D(_VolumeScatter, uvw);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user