
07.11.2010, 18:10
|
|
Новичок
|
|
Регистрация: 19.11.2007
Сообщений: 4
|
|
|
Z-буфер. Раскраска и удаление невидимых граней.
Объясните, пожалуйста, популярно - как это работает. Перелопатил кучу книг по этому поводу - везде всё сводится к "это самый простой метод".
|
|

07.11.2010, 18:29
|
|
|
|
А чё неясно-то?
Для пикселя (x, y) на экране хранишь его глубину z. Потом, когда тебя просят нарисовать на месте (x, y) другой пиксель, сравниваешь глубины и не рисуешь, если новый пиксель глубже текущего. Всё.
|
|

07.11.2010, 18:30
|
|
|
Сообщение от гость
|
|
Для пикселя (x, y) на экране
|
*для каждого пикселя
|
|

07.11.2010, 18:34
|
|
|
|
Цитата:
|
|
Перелопатил кучу книг по этому поводу - везде всё сводится к "это самый простой метод".
|
Да, самый простой и надежный. Идеален для hardware. Единственный минус - требует лишнюю память. Лет 15-20 назад, когда '640K ought to be enough for anybody", это было большой проблемой. А сейчас память уже никто и не считает...
|
|

07.11.2010, 18:43
|
|
|
Сообщение от гость
|
|
Для пикселя (x, y) на экране хранишь его глубину z. Потом, когда тебя просят нарисовать на месте (x, y) другой пиксель, сравниваешь глубины и не рисуешь, если новый пиксель глубже текущего. Всё.
|
И вот еще что - описанную процедуру не ты должен делать, а видеокарта, которая программируется через opengl/directx. На процессоре ты в real-time не просчитаешь (ты же не джон кармак?)
|
|

07.11.2010, 19:23
|
|
Новичок
|
|
Регистрация: 19.11.2007
Сообщений: 4
|
|
|
Если рисунок на картинной плоскости состоит из линий и вершин,и пока что не закрашен, как получить глубину некоторого пикселя внутри грани?
|
|

07.11.2010, 19:24
|
|
Новичок
|
|
Регистрация: 19.11.2007
Сообщений: 4
|
|
Сообщение от гость
|
|
И вот еще что - описанную процедуру не ты должен делать, а видеокарта, которая программируется через opengl/directx. На процессоре ты в real-time не просчитаешь (ты же не джон кармак?)
|
Если бы у меня стояла задача использования z-буфера, уже реализованного аппаратно - я бы не спрашивал о том, как это работает. Мне необходимо реализовать его самостоятельно, без средств opengl или DirectX.
|
|

07.11.2010, 19:58
|
|
|
Сообщение от @rtur
|
|
Если рисунок на картинной плоскости состоит из линий и вершин
|
"Проволочная графика", да? Тогда тебе z buffer и не нужен. Рисуешь свои линии и вершины, и все.
|
Цитата:
|
|
,и пока что не закрашен, как получить глубину некоторого пикселя внутри грани?
|
В системах трехмерной графики стандартный примитив - треугольник.
Поэтому сначала проведи триангуляцию, и получи набор трехмерных треугольников которые будешь закрашивать. Ну, а потом и закрашивай каждый из них по очереди - вычисли проекцию на экран (это тоже треугольник, достаточно всего лишь спроецировать вершины, вот почему везде треугольники и используются), ну и закрашивай его на экране. Это называет "растеризация". Это можно сделать, например, по строчно, т.е. в цикле перебираешь все y-ки, входящие в треугольник, вычисляешь x-ы левой и правой границы и рисуешь эту строчку. z-ки линейно интерполируешь.
|
|

07.11.2010, 20:22
|
|
|
Вот тут короче пример как растеризовать треугольник (без z буфера) - http://compgraphics.info/2D/triangle_rasterization.php
Кажется, там Брезенхамом вычисляют x'ы на границах - это не принципиально, только для скорости.
Тебе нужно лишь выкинуть из исходника говно (SetPixel, HDC...) и в цикле, закрашивающем строке вначале посчитать z левой и правой границы, а в самом цикле закрашивать строку в z-буфере, линейно интерполируя z.
|
|
| Опции темы |
Поиск в этой теме |
|
|
|
| Опции просмотра |
Линейный вид
|
|
| |