#include "Macros.fxh" //from FNA #include "Lighting.fxh" DECLARE_TEXTURE(gPosition, 0); DECLARE_TEXTURE(gAlbedo, 1); DECLARE_TEXTURE(gNormal, 2); DECLARE_TEXTURE(gMetallicRoughness, 3); BEGIN_CONSTANTS float3 EyePosition _ps(c0) _cb(c0); float3 PointLightPosition _ps(c1) _cb(c1); float3 PointLightColor _ps(c2) _cb(c2); MATRIX_CONSTANTS END_CONSTANTS struct VertexInput { float4 Position : POSITION; float2 TexCoord : TEXCOORD; }; struct PixelInput { float4 Position : SV_POSITION; float2 TexCoord : TEXCOORD0; }; PixelInput main_vs(VertexInput input) { PixelInput output; output.Position = input.Position; output.TexCoord = input.TexCoord; return output; } // Pixel Shader float4 ComputeColor( float3 worldPosition, float3 worldNormal, float3 albedo, float metallic, float roughness ) { float3 V = normalize(EyePosition - worldPosition); float3 N = normalize(worldNormal); float3 F0 = float3(0.04, 0.04, 0.04); F0 = lerp(F0, albedo, metallic); float3 lightDir = PointLightPosition - worldPosition; float3 L = normalize(lightDir); float distance = length(lightDir); float attenuation = 1.0 / (distance * distance); float3 radiance = PointLightColor * attenuation; float3 color = ComputeLight(L, radiance, F0, V, N, albedo, metallic, roughness, 1.0); return float4(color, 1.0); } float4 main_ps(PixelInput input) : SV_TARGET0 { float3 worldPosition = SAMPLE_TEXTURE(gPosition, input.TexCoord).rgb; float3 normal = SAMPLE_TEXTURE(gNormal, input.TexCoord).xyz; float3 albedo = SAMPLE_TEXTURE(gAlbedo, input.TexCoord).rgb; float2 metallicRoughness = SAMPLE_TEXTURE(gMetallicRoughness, input.TexCoord).rg; return ComputeColor( worldPosition, normal, albedo, metallicRoughness.r, metallicRoughness.g ); } Technique DeferredPBR_Point { Pass { VertexShader = compile vs_3_0 main_vs(); PixelShader = compile ps_3_0 main_ps(); } }