diff options
Diffstat (limited to 'impostor.cginc')
| -rw-r--r-- | impostor.cginc | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/impostor.cginc b/impostor.cginc index f271612..1623681 100644 --- a/impostor.cginc +++ b/impostor.cginc @@ -105,8 +105,13 @@ ImpostorSample SampleImpostorCell(float2 cell, float3 frameDir, float3 pivotToCa ImpostorSample BlendImpostorSamples(ImpostorSample s00, ImpostorSample s01, ImpostorSample s10, ImpostorSample s11, float4 bw) { ImpostorSample result; result.albedo = s00.albedo * bw.x + s01.albedo * bw.y + s10.albedo * bw.z + s11.albedo * bw.w; - result.normal = s00.normal * bw.x + s01.normal * bw.y + s10.normal * bw.z + s11.normal * bw.w; - result.metallicGloss = s00.metallicGloss * bw.x + s01.metallicGloss * bw.y + s10.metallicGloss * bw.z + s11.metallicGloss * bw.w; + + // Weight normal/metallicGloss by alpha to avoid blending with transparent (zero) pixels + float4 alphaBw = float4(s00.albedo.a, s01.albedo.a, s10.albedo.a, s11.albedo.a) * bw; + alphaBw /= max(dot(alphaBw, 1), 0.001); + + result.normal = s00.normal * alphaBw.x + s01.normal * alphaBw.y + s10.normal * alphaBw.z + s11.normal * alphaBw.w; + result.metallicGloss = s00.metallicGloss * alphaBw.x + s01.metallicGloss * alphaBw.y + s10.metallicGloss * alphaBw.z + s11.metallicGloss * alphaBw.w; return result; } |
