@@ -143,7 +143,7 @@ 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 ;
146+ // if (!(inside(pa_clip) && inside(pb_clip) && inside(pc_clip))) continue;
147147
148148 // Деление на w => NDC [-1,1] [web:12]
149149 float inv_wa = 1 .f / pa_clip.w ;
@@ -198,23 +198,16 @@ namespace cg::renderer
198198 // Depth test [web:44]
199199 if (depth_test (z, size_t (x), size_t (y))) {
200200 // Вызов pixel_shader: он сам вернёт cg::color; конверсия в RT — снаружи/при записи
201- cg::color out = pixel_shader (
202- // Можно выбрать один из вершинных атрибутов или интерполировать (минимум — проброс одного)
203- // Для простоты используем барицентрическую интерполяцию ambient/прочих полей VB, если нужно расширить.
204- VB{
205- // Предполагается VB с полями position, normal, texcoord, ambient
206- fw0 * va_ps.position + fw1 * vb_ps.position + fw2 * vc_ps.position ,
207- fw0 * va_ps.normal + fw1 * vb_ps.normal + fw2 * vc_ps.normal ,
208- fw0 * va_ps.texcoord + fw1 * vb_ps.texcoord ,
209- fw0 * va_ps.ambient + fw1 * vb_ps.ambient + fw2 * vc_ps.ambient
210- },
211- z
212- );
213-
214- // Запись цвета в RT; предполагаем RT — cg::unsigned_color [web:41]
201+ // Защита от некорректной глубины
202+ if (!std::isfinite (z)) continue ;
203+ z = std::min (1 .f , std::max (-1 .f , z));
204+
205+ // Простой цветовой градиент по барицентрикам, чтобы визуально увидеть треугольник
206+ float3 rgb = float3{ fw0, fw1, fw2 };
207+ cg::color out = cg::color::from_float3 (rgb);
208+
209+ // Запись цвета и глубины
215210 render_target->item (size_t (x), size_t (y)) = RT::from_float3 (out.to_float3 ());
216-
217- // Обновление z-буфера [web:44]
218211 if (depth_buffer) depth_buffer->item (size_t (x), size_t (y)) = z;
219212 }
220213 }
0 commit comments