Files
FlaxEngine/Source/Shaders/Sky.shader

100 lines
2.9 KiB
Plaintext

// Copyright (c) Wojciech Figat. All rights reserved.
#include "./Flax/Common.hlsl"
#include "./Flax/MaterialCommon.hlsl"
#include "./Flax/GBuffer.hlsl"
#include "./Flax/Common.hlsl"
#include "./Flax/AtmosphereFog.hlsl"
META_CB_BEGIN(0, Data)
float4x4 WVP;
float3 ViewOffset;
float Padding;
GBufferData GBuffer;
AtmosphericFogData AtmosphericFog;
META_CB_END
DECLARE_GBUFFERDATA_ACCESS(GBuffer)
struct MaterialInput
{
float4 Position : SV_Position;
float4 ScreenPos : TEXCOORD0;
};
// Vertex Shader function for GBuffer Pass
META_VS(true, FEATURE_LEVEL_ES2)
META_VS_IN_ELEMENT(POSITION, 0, R32G32B32_FLOAT, 0, 0, PER_VERTEX, 0, true)
MaterialInput VS(ModelInput_PosOnly input)
{
MaterialInput output;
// Compute vertex position
output.Position = mul(float4(input.Position.xyz, 1), WVP);
output.ScreenPos = output.Position;
// Place pixels on the far plane
output.Position = output.Position.xyzz;
return output;
}
// Pixel Shader function for GBuffer Pass
META_PS(true, FEATURE_LEVEL_ES2)
GBufferOutput PS_Sky(MaterialInput input)
{
GBufferOutput output;
// Obtain UVs corresponding to the current pixel
float2 uv = (input.ScreenPos.xy / input.ScreenPos.w) * float2(0.5, -0.5) + float2(0.5, 0.5);
// Sample atmosphere color
GBufferData gBufferData = GetGBufferData();
float3 vsPos = GetViewPos(gBufferData, uv, LinearZ2DeviceDepth(gBufferData, 1));
float3 wsPos = mul(float4(vsPos, 1), gBufferData.InvViewMatrix).xyz;
float3 viewVector = wsPos - gBufferData.ViewPos;
float4 color = GetAtmosphericFog(AtmosphericFog, gBufferData.ViewFar, wsPos + ViewOffset, gBufferData.ViewPos + ViewOffset);
// Pack GBuffer
output.Light = color;
output.RT0 = float4(0, 0, 0, 0);
output.RT1 = float4(1, 0, 0, SHADING_MODEL_UNLIT);
output.RT2 = float4(0, 0, 0, 0);
output.RT3 = float4(0, 0, 0, 0);
return output;
}
META_PS(true, FEATURE_LEVEL_ES2)
float4 PS_Fog(Quad_VS2PS input) : SV_Target0
{
float4 result;
/*
// Sample GBuffer
GBufferSample gBuffer = SampleGBuffer(GBuffer, input.TexCoord);
// TODO: set valid scene color for better inscatter reflectance
//float3 sceneColor = gBuffer.Color * AtmosphericFogDensityOffset;
float3 sceneColor = float3(0, 0, 0);
// Sample atmosphere color
float3 viewVector = gBuffer.WorldPos - GBuffer.ViewPos;
float SceneDepth = length(ViewVector);
result = GetAtmosphericFog(AtmosphericFog, GBuffer.ViewFar, GBuffer.ViewPos, viewVector, SceneDepth, sceneColor);
//result.rgb = normalize(ViewVector);
//result.rgb = ViewVector;
//result.rgb = SceneDepth.xxx / GBuffer.ViewFar * 0.5f;
//result = float4(input.TexCoord, 0, 1);
//result = AtmosphereTransmittanceTexture.Sample(SamplerLinearClamp, input.TexCoord);
//result = float4(AtmosphereIrradianceTexture.Sample(SamplerLinearClamp, input.TexCoord).rgb*5.0, 1.0);
//result = AtmosphereInscatterTexture.Sample(SamplerLinearClamp, float3(input.TexCoord.xy, (AtmosphericFogSunDirection.x+1.0)/2.0));
*/
// TODO: finish fog
result = float4(1, 0, 0, 1);
return result;
}