summaryrefslogtreecommitdiffstats
path: root/impostor.cginc
diff options
context:
space:
mode:
Diffstat (limited to 'impostor.cginc')
-rw-r--r--impostor.cginc9
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;
}