Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.11.2010, 19:10
Новичок

Отправить личное сообщение для @rtur Посмотреть профиль Найти все сообщения от @rtur
 
Регистрация: 19.11.2007
Сообщений: 4

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

 
Сообщений: n/a

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

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

 
Сообщений: n/a

Сообщение от гость Посмотреть сообщение
Для пикселя (x, y) на экране
*для каждого пикселя
  #4  
Старый 07.11.2010, 19:34
гость

 
Сообщений: n/a

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

 
Сообщений: n/a

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

Отправить личное сообщение для @rtur Посмотреть профиль Найти все сообщения от @rtur
 
Регистрация: 19.11.2007
Сообщений: 4

Если рисунок на картинной плоскости состоит из линий и вершин,и пока что не закрашен, как получить глубину некоторого пикселя внутри грани?
  #7  
Старый 07.11.2010, 20:24
Новичок

Отправить личное сообщение для @rtur Посмотреть профиль Найти все сообщения от @rtur
 
Регистрация: 19.11.2007
Сообщений: 4

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

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

 
Сообщений: n/a

Сообщение от @rtur Посмотреть сообщение
Если рисунок на картинной плоскости состоит из линий и вершин
"Проволочная графика", да? Тогда тебе z buffer и не нужен. Рисуешь свои линии и вершины, и все.

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

 
Сообщений: n/a

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

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


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
раскраска как на географической карте VShvets Обработка изображений, звук, графика 7 01.11.2010 03:06
задача о кликах и рёберная раскраска графов гость Графы 2 13.05.2009 17:37
Раскраска Michael_K Математические алгоритмы (другое) 1 16.07.2008 22:49
Дерево граней seregarem Графы 7 14.04.2008 11:46