@@ -143,8 +143,8 @@ namespace cg::renderer
143143 float w = p.w ;
144144 return (-w <= p.x && p.x <= w) && (-w <= p.y && p.y <= w) && (-w <= p.z && p.z <= w);
145145 };
146- // if (!(inside(pa_clip) && inside(pb_clip) && inside(pc_clip))) continue;
147-
146+ // Мягкое отсечение: отбрасываем только треугольники целиком за камерой (все w <= 0)
147+ if (pa_clip. w <= 0 . f && pb_clip. w <= 0 . f && pc_clip. w <= 0 . f ) continue ;
148148 // Деление на w => NDC [-1,1] [web:12]
149149 float inv_wa = 1 .f / pa_clip.w ;
150150 float inv_wb = 1 .f / pb_clip.w ;
@@ -194,13 +194,12 @@ namespace cg::renderer
194194
195195 // Интерполяция глубины в NDC (линейная по экрану) [web:24]
196196 float z = fw0 * pa_ndc.z + fw1 * pb_ndc.z + fw2 * pc_ndc.z ;
197+ if (!std::isfinite (z)) continue ;
198+ z = std::min (1 .f , std::max (-1 .f , z));
199+
197200
198201 // Depth test [web:44]
199202 if (depth_test (z, size_t (x), size_t (y))) {
200- // Вызов pixel_shader: он сам вернёт cg::color; конверсия в RT — снаружи/при записи
201- // Защита от некорректной глубины
202- if (!std::isfinite (z)) continue ;
203- z = std::min (1 .f , std::max (-1 .f , z));
204203
205204 // Простой цветовой градиент по барицентрикам, чтобы визуально увидеть треугольник
206205 float3 rgb = float3{ fw0, fw1, fw2 };
0 commit comments