@@ -3,8 +3,8 @@ cbuffer ScreenQuadBuffer : register(b0)
33{
44 matrix InverseView;
55 matrix InverseProjection;
6- float3 cameraPos;
7- float2 screenSize ;
6+ float4 cameraPos;
7+ float4 screenInfo ;
88}
99
1010struct LightData {
@@ -84,6 +84,7 @@ float GeometrySmith(float3 N, float3 V, float3 L, float roughness)
8484float3 ReconstructPosition (int2 pixelCoord, uint index)
8585{
8686 float depth = depthTex.Load (pixelCoord, index).r;
87+ float2 screenSize = float2 (screenInfo.x, screenInfo.y);
8788
8889 float2 ndc = (float2 (pixelCoord) / screenSize) * 2.0f - 1.0f ;
8990 ndc.y *= -1.0f ;
@@ -127,9 +128,7 @@ PixelOutput PixelMain(VertexOutput input, uint index : SV_SampleIndex)
127128{
128129 float depth = depthTex.Load (input.position.xy, index).r;
129130 float3 color = float3 (0.f , 0.f , 0.f );
130-
131- float3 lightPos = Lights[0 ].position.rgb;
132- float3 lightColor = Lights[0 ].color.rgb;
131+
133132
134133 int2 pixelCoord = int2 (input.position.xy);
135134
@@ -141,34 +140,42 @@ PixelOutput PixelMain(VertexOutput input, uint index : SV_SampleIndex)
141140 float ao = ormData.r;
142141 float roughness = ormData.g;
143142 float metallic = ormData.b;
143+ uint numLights = screenInfo.z;
144144
145- float3 V = normalize (cameraPos - pos);
146- float3 F0 = lerp (float3 (0.04f , 0.04f , 0.04f ), albedoColor, metallic);
145+ for (uint i = 0 ; i < numLights; i++)
146+ {
147+ float3 lightPos = Lights[i].position.rgb;
148+ float3 lightColor = Lights[i].color.rgb;
147149
148- float3 L = normalize (lightPos - pos);
149- float3 H = normalize (V + L);
150- float distance = length (lightPos - pos);
151- float attenuation = 1.0f / (distance * distance + 1.f );
152- float3 radiance = lightColor * attenuation;
153- radiance *= (1.0 + metallic * 0.2 );
150+ float3 V = normalize (cameraPos.xyz - pos);
151+ float3 F0 = lerp (float3 (0.04f , 0.04f , 0.04f ), albedoColor, metallic);
154152
155- float NDF = DistributionGGX (N, H, roughness);
156- float G = GeometrySmith (N, V, L, roughness);
157- float3 F = FresnelShlick (saturate (dot (H, V)), F0);
153+ float3 L = normalize (lightPos - pos);
154+ float3 H = normalize (V + L);
155+ float distance = length (lightPos - pos);
156+ float attenuation = 1.0f / (distance * distance + 1.f );
157+ float3 radiance = lightColor * attenuation;
158+ radiance *= (1.0 + metallic * 0.2 );
158159
159- float3 kS = F;
160- float3 kD = (1.0 - kS) * (1.0 - metallic);
160+ float NDF = DistributionGGX (N, H, roughness);
161+ float G = GeometrySmith (N, V, L, roughness);
162+ float3 F = FresnelShlick (saturate (dot (H, V)), F0);
161163
162- float3 numerator = NDF * G * F;
163- float denominator = 4.f * max (dot (N, V), 0.f ) * max (dot (N, L), 0.f ) + 0.0001f ;
164- float3 specular = numerator / denominator;
164+ float3 kS = F;
165+ float3 kD = (1.0 - kS) * (1.0 - metallic);
165166
166- float NdotL = max (dot (N, L), 0.f );
167- float3 Lo = (kD * albedoColor / PI + specular) * radiance * NdotL;
167+ float3 numerator = NDF * G * F;
168+ float denominator = 4.f * max (dot (N, V), 0.f ) * max (dot (N, L), 0.f ) + 0.0001f ;
169+ float3 specular = numerator / denominator;
168170
169- float3 ambient = 0.1f * albedoColor * ao;
171+ float NdotL = max (dot (N, L), 0.f );
172+ float3 Lo = (kD * albedoColor / PI + specular) * radiance * NdotL;
170173
171- color = ambient + Lo;
174+ color += Lo;
175+ }
176+
177+ float3 ambient = 0.1f * albedoColor * ao;
178+ color += ambient;
172179
173180 /* Tonemap */
174181 color = color / (color + 1.0 );
0 commit comments