Алгоритмы, методы, исходники / Форум

Алгоритмы, методы, исходники / Форум (http://forum.algolist.ru/)
-   Обработка изображений, звук, графика (http://forum.algolist.ru/algorithm-image-graphics/)
-   -   Z-буфер. Раскраска и удаление невидимых граней. (http://forum.algolist.ru/algorithm-image-graphics/4412-z-bufer-raskraska-i-udalenie-nevidimyh-granei.html)

@rtur 07.11.2010 19:10

Z-буфер. Раскраска и удаление невидимых граней.
 
Объясните, пожалуйста, популярно - как это работает. Перелопатил кучу книг по этому поводу - везде всё сводится к "это самый простой метод".

гость 07.11.2010 19:29

А чё неясно-то?

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

гость 07.11.2010 19:30

Цитата:

Сообщение от гость (Сообщение 13309)
Для пикселя (x, y) на экране

*для каждого пикселя

гость 07.11.2010 19:34

Цитата:

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

гость 07.11.2010 19:43

Цитата:

Сообщение от гость (Сообщение 13309)
Для пикселя (x, y) на экране хранишь его глубину z. Потом, когда тебя просят нарисовать на месте (x, y) другой пиксель, сравниваешь глубины и не рисуешь, если новый пиксель глубже текущего. Всё.

И вот еще что - описанную процедуру не ты должен делать, а видеокарта, которая программируется через opengl/directx. На процессоре ты в real-time не просчитаешь (ты же не джон кармак?)

@rtur 07.11.2010 20:23

Если рисунок на картинной плоскости состоит из линий и вершин,и пока что не закрашен, как получить глубину некоторого пикселя внутри грани?

@rtur 07.11.2010 20:24

Цитата:

Сообщение от гость (Сообщение 13312)
И вот еще что - описанную процедуру не ты должен делать, а видеокарта, которая программируется через opengl/directx. На процессоре ты в real-time не просчитаешь (ты же не джон кармак?)


Если бы у меня стояла задача использования z-буфера, уже реализованного аппаратно - я бы не спрашивал о том, как это работает. Мне необходимо реализовать его самостоятельно, без средств opengl или DirectX.

гость 07.11.2010 20:58

Цитата:

Сообщение от @rtur (Сообщение 13313)
Если рисунок на картинной плоскости состоит из линий и вершин

"Проволочная графика", да? Тогда тебе z buffer и не нужен. Рисуешь свои линии и вершины, и все.

Цитата:

,и пока что не закрашен, как получить глубину некоторого пикселя внутри грани?
В системах трехмерной графики стандартный примитив - треугольник.
Поэтому сначала проведи триангуляцию, и получи набор трехмерных треугольников которые будешь закрашивать. Ну, а потом и закрашивай каждый из них по очереди - вычисли проекцию на экран (это тоже треугольник, достаточно всего лишь спроецировать вершины, вот почему везде треугольники и используются), ну и закрашивай его на экране. Это называет "растеризация". Это можно сделать, например, по строчно, т.е. в цикле перебираешь все y-ки, входящие в треугольник, вычисляешь x-ы левой и правой границы и рисуешь эту строчку. z-ки линейно интерполируешь.

гость 07.11.2010 21:22

Вот тут короче пример как растеризовать треугольник (без z буфера) - http://compgraphics.info/2D/triangle_rasterization.php
Кажется, там Брезенхамом вычисляют x'ы на границах - это не принципиально, только для скорости.

Тебе нужно лишь выкинуть из исходника говно (SetPixel, HDC...) и в цикле, закрашивающем строке вначале посчитать z левой и правой границы, а в самом цикле закрашивать строку в z-буфере, линейно интерполируя z.


Часовой пояс GMT +4, время: 18:48.