diff --git a/lib/gfx/gx_shader.cpp b/lib/gfx/gx_shader.cpp index 6c847a2..985382d 100644 --- a/lib/gfx/gx_shader.cpp +++ b/lib/gfx/gx_shader.cpp @@ -888,8 +888,15 @@ wgpu::ShaderModule build_shader(const ShaderConfig& config, const ShaderInfo& in var dist_attn = dot(light.dist_att, vec3f(1.0, dist, dist2)); attn = max(0.0, cos_attn / dist_attn);)"""); } else if (cc.attnFn == GX_AF_SPEC) { - diffFn = GX_DF_NONE; - FATAL("AF_SPEC unimplemented"); + std::string normal = UsePerPixelLighting ? "in.mv_nrm" : "mv_nrm"; + std::string dist_attn = diffFn != GX_DF_NONE + ? "max(0.0, dot(normalize(light.dist_att), vec3f(1.0, attn, attn * attn)));" + : "max(0.0, dot(light.dist_att, vec3f(1.0, attn, attn * attn)));"; + lightAttnFn = fmt::format(R"""( + attn = select(0.0, max(0.0, dot({0}, light.dir)), dot({0}, ldir) >= 0.0); + var cos_attn = dot(light.cos_att, vec3f(1.0, attn, attn * attn)); + var dist_attn = {1}; + attn = max(0.0, cos_attn / dist_attn);)""", normal, dist_attn); } if (diffFn == GX_DF_NONE) { lightDiffFn = "1.0";