Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Метод Z - буфера! Отрисовка DirectX!


Автор: PRF 14.5.2009, 00:29
Здравствуйте. У меня есть каркасная сцена, для отрисовки я использую DirectX, только для отрисовки! Зачем я это делаю, лучше не спрашивайте, предмет у нас компьютерная графика, для отрисовки можно было использовать все что хочешь! 
Вот есть задание:
1) удалить нелицывые грани полигональных моделей (удалять их или просто не рисовать , разницы нет)
2) отсечение не проецируемых ребер

Хочу использовать алгоритм Z - буфера. Но как применить его к Directx я не знаю! Я для отрисовки фигуры использую индексы, а алгоритм Z буфера предполагает проход по всей картинки(по экрану), я так понял, по пикселям и присвоения цвета тому пикселю которому надо)) ну так в кратце, короче завязано на всем экране и цвете. 

А если я для отрисовки использую DirectX , да еще притом использую индексы. Есть какие нибудь идея как можно реализовать Z буфер? просто идейку подкиньте пожалуйста. Спасибо.

Автор: BorisVorontsov 14.5.2009, 18:01
Какая разница, индексированные у тебя примитивы или нет? Индексация просто оптимизирует меш.

Цитата(PRF @  14.5.2009,  00:29 Найти цитируемый пост)
Есть какие нибудь идея как можно реализовать Z буфер?


Раз ты используешь DirectX, то он у тебя уже реализован, и по умолчанию используется. Если хочется им управлять, D3DRS_ZFUNC в помощь

Автор: PRF 14.5.2009, 18:14
Мне надо самому написать удаление нелицевый граней. Алгоритм я взял Z - буфера. Я знаю, что он есть в directx уже.
Вот и спрашиваю, как вообще его можно реализовать, там же вроде бы надо иметь цветовую составлявляющую каждого пикселя экрана.. 


Автор: C/L 15.5.2009, 08:02
Цитата(PRF @  14.5.2009,  20:14 Найти цитируемый пост)
Мне надо самому написать удаление нелицевый граней. Алгоритм я взял Z - буфера. 

Удаление не лицевых граней и z-буфер совершенно разные вещи, предназначенные для разных целей. 

Z-буфер применяется для правильного наложения примитивов друг на друга - те кто ближе должны накладываться на тех кто дальше. Таким образом примитивы могут быть нарисованы в любом порядке и даже пересекаться, т.к. при отрисовке каждого пиксела сравнивается глубина текущего пиксела экрана и глубина рисуемого. Особенность: проверку проходит каждый пиксел.

Отсечение нелицевых поверхностей в DirectX осуществляется проверкой порядка обхода точек уже спроецированного треугольника - он может быть по часовой и против часовой стрелки и в зависимости от этого DirectX решает выводить данный треугольник или нет. Если пронумеровать все точки треугольника и посмотреть с одной стороны - последовательный обход по порядку их номеров будет по часовой стрелке, а если посмотреть с другой стороны - против часовой. А проверка обхода как раз происходит уже после проецирования, т.е. после умножения вертексов треугольника на все матрицы вида, проекции... Особенность: проверку проходит треугольник.

Если все примитивы сцены - закнутые области "без дырок", без других каких нибудь извратов, можно отключить проверку обхода и обойтись одним z-буфером, так как нелицевые поверхности обычно расположены дальше лицевых, но это не оптимально. А вот осуществить z-буфер самому на CPU и отказаться от аппаратной поддержки видеокарты - это будет жутко тормозно. Так как в этом случае скорее всего потребуется написать собственный рендеринг.

Автор: PRF 15.5.2009, 21:15
ммм.. спасибо, ага я тут уже почитал, что все это аппаратно реализуется, z - буфер, и программно это будет плохо сделать! 
а не подскажите тогда алгоритм удаления не лицевых граней, я вот тут вроде бы алгоритм Робертса нашел, но что то я его не понимаю???. ((

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)