Lab · потрогать руками
Мини-растеризатор куба
Куб, прогнанный через ту же цепочку
model→view→проекция→экран чистым software-растеризатором (барицентрика, без GPU). Крути куб и FOV, выключай z-буфер — и смотри, как дальние грани лезут поверх ближних; включай backface culling и переключай перспективу/ортографию. Каждый тумблер — отдельный шаг конвейера, который видно глазами.Как пользоваться
Каждый кадр все 12 треугольников куба поворачиваются, проецируются (x_s = f·x/z) и заливаются по пикселям. Z-буфер: на каждый пиксель храним ближайшую обратную глубину 1/z и рисуем фрагмент, только если он ближе. Выключи его — и порядок отрисовки начнёт врать. Backface cull по нормали грани выкидывает повёрнутые от нас грани. Перспектива делит на глубину (дальнее меньше); ортография — нет (грани одного размера). Счётчики показывают: нарисовано треугольников, отбраковано backface, фрагментов отвергнуто z-тестом.
Что заметить: 1) сними z-буфер и backface cull разом, включи авто-вращение — задние грани протыкают передние, картинка «мерцает» порядком отрисовки. Верни z-буфер — стало верно при любом порядке. 2) сними только backface cull (z-буфер вкл) — видно, что отбраковка половины граней была не нужна для корректности (z-буфер и так разрулил), но счётчик «нарисовано» удвоился: cull экономил работу. 3) переключи на ортографию — куб перестаёт сужаться вдаль, дальние и ближние грани одного размера (нет деления на
z). 4) задери FOV к 120° — сильное «рыбий глаз»-искажение у краёв; узкий FOV ≈ телефото, грани почти параллельны.🏠 Что дальше
Вернись в урок, блок «🔧 Запусти и поковыряй»: в Godot выведи на квад DEPTH_TEXTURE — увидишь ту же глубину, что лаба хранит в z-буфере, но нелинейно распределённую (1/z): ближнее «растянуто», дальнее «слиплось». Поставь две копланарные грани вплотную → поймаешь z-fighting, которого тут на одном кубе не видно.
Связи
из урока
3D-конвейер — теория: цепочка матриц, perspective divide на
w, клиппинг по near, z-буфер vs painter.контраст
Doom и BSP — там порядок рисуют сортировкой геометрии (BSP), тут — буфером глубины по пикселям. Выключенный z-буфер в лабе = почему Doom приходилось сортировать.
Что заметить по итогу (чеклист наблюдений)
- z-буфер выкл + cull выкл → задние грани протыкают передние; z-буфер вкл → верно при любом порядке. Буфер сортирует пиксели, а не полигоны.
- cull выкл (z-буфер вкл) → картинка та же, но «нарисовано треугольников» удваивается: culling — это экономия, не корректность (для выпуклого тела).
- перспектива → дальняя грань меньше ближней (деление на
z); ортография → грани одного размера. - широкий FOV → искажение краёв («рыбий глаз»); узкий → почти параллельная проекция.