diff --git a/Effects/PBREffect.cs b/Effects/PBREffect.cs index ba73003..852bde2 100644 --- a/Effects/PBREffect.cs +++ b/Effects/PBREffect.cs @@ -88,8 +88,14 @@ namespace Smuggler { world = value; worldParam.SetValue(world); - worldViewProjectionParam.SetValue(world * view * projection); - worldInverseTransposeParam.SetValue(Matrix.Transpose(Matrix.Invert(world))); + + Matrix.Multiply(ref world, ref view, out Matrix worldView); + Matrix.Multiply(ref worldView, ref projection, out Matrix worldViewProj); + worldViewProjectionParam.SetValue(worldViewProj); + + Matrix.Invert(ref world, out Matrix worldInverse); + Matrix.Transpose(ref worldInverse, out Matrix worldInverseTranspose); + worldInverseTransposeParam.SetValue(worldInverseTranspose); } } @@ -100,8 +106,13 @@ namespace Smuggler { view = value; viewParam.SetValue(view); - worldViewProjectionParam.SetValue(world * view * projection); - eyePositionParam.SetValue(Matrix.Invert(view).Translation); + + Matrix.Multiply(ref world, ref view, out Matrix worldView); + Matrix.Multiply(ref worldView, ref projection, out Matrix worldViewProj); + worldViewProjectionParam.SetValue(worldViewProj); + + Matrix.Invert(ref view, out Matrix inverseView); + eyePositionParam.SetValue(inverseView.Translation); } } @@ -112,7 +123,10 @@ namespace Smuggler { projection = value; projectionParam.SetValue(projection); - worldViewProjectionParam.SetValue(world * view * projection); + + Matrix.Multiply(ref world, ref view, out Matrix worldView); + Matrix.Multiply(ref worldView, ref projection, out Matrix worldViewProj); + worldViewProjectionParam.SetValue(worldViewProj); } } diff --git a/Effects/PBREffect.fx b/Effects/PBREffect.fx index e26bd49..28dd3b5 100644 --- a/Effects/PBREffect.fx +++ b/Effects/PBREffect.fx @@ -52,10 +52,10 @@ struct PixelShaderInput PixelShaderInput main_vs(VertexShaderInput input) { PixelShaderInput output; - + output.PositionWS = mul(input.Position, World).xyz; output.TexCoord = input.TexCoord; - output.NormalWS = normalize(mul(WorldInverseTranspose, input.Normal)); + output.NormalWS = normalize(mul(input.Normal, (float3x3)WorldInverseTranspose)); output.Position = mul(input.Position, WorldViewProjection); return output; @@ -107,6 +107,9 @@ float4 None(PixelShaderInput input) : SV_TARGET float3 N = normalize(input.NormalWS); float3 V = normalize(EyePosition - input.PositionWS); + float3 F0 = float3(0.04, 0.04, 0.04); + F0 = lerp(F0, Albedo, Metallic); + float3 Lo = float3(0.0, 0.0, 0.0); for (int i = 0; i < 4; i++) @@ -119,12 +122,9 @@ float4 None(PixelShaderInput input) : SV_TARGET float attenuation = 1.0 / (distance * distance); float3 radiance = LightColors[i] * attenuation; - float3 F0 = float3(0.04, 0.04, 0.04); - F0 = lerp(F0, Albedo, Metallic); - float3 F = FresnelSchlick(max(dot(H, V), 0.0), F0); - float NDF = DistributionGGX(N, H, Roughness); float G = GeometrySmith(N, V, L, Roughness); + float3 F = FresnelSchlick(max(dot(H, V), 0.0), F0); float3 numerator = NDF * G * F; float denominator = 4.0 * max(dot(N, V), 0.0) * max(dot(N, L), 0.0); diff --git a/Effects/PBREffect.fxb b/Effects/PBREffect.fxb index bcc23fa..2a7a43f 100644 Binary files a/Effects/PBREffect.fxb and b/Effects/PBREffect.fxb differ diff --git a/Importer.cs b/Importer.cs index 7f1b75c..ff13912 100644 --- a/Importer.cs +++ b/Importer.cs @@ -231,24 +231,24 @@ namespace Smuggler effect.AO = 1f; effect.Lights[0] = new PBRLight( - new Vector3(-10f, 10f, 10f), + new Vector3(-10f, 10f, -10f), new Vector3(300f, 300f, 300f) ); - effect.Lights[1] = new PBRLight( - new Vector3(10f, 10f, 10f), - new Vector3(300f, 300f, 300f) - ); + // effect.Lights[1] = new PBRLight( + // new Vector3(10f, 10f, 10f), + // new Vector3(300f, 300f, 300f) + // ); - effect.Lights[2] = new PBRLight( - new Vector3(-10f, -10f, 10f), - new Vector3(300f, 300f, 300f) - ); + // effect.Lights[2] = new PBRLight( + // new Vector3(-10f, -10f, 10f), + // new Vector3(300f, 300f, 300f) + // ); - effect.Lights[3] = new PBRLight( - new Vector3(10f, -10f, 10f), - new Vector3(300f, 300f, 300f) - ); + // effect.Lights[3] = new PBRLight( + // new Vector3(10f, -10f, 10f), + // new Vector3(300f, 300f, 300f) + // ); /* FIXME: how to load cube maps from GLTF? */ /*