Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Z-Order [Delphi, OpenGL, Windows]


KreeS ©   (2006-02-26 01:10:00) 

Я чет совсем запутался...
Кто-нить в курсе какие параметры вида надо установить в OGL чтобы:
а) было абсолютное 2д без перспективы
б) при этом учитывалась глубина
т.е. чтоб я мог у каждого спрайта задать свой Z-Order и, подставляя его в качестве z-координаты при рисовании, контролировал что поверх чего рисуется


KreeS   (2006-02-26 21:05:00) [1]

XProger
О да, свершилось!
Это оно. Спасибо!


XProger   (2006-02-26 17:08:00) [2]

Если тебе нужна не прозрачность а "дырки" в текстуре
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5);

В противном случае - сортируй, но при этом отпадает необходимость в использовании Z-Buffer'а


KreeS   (2006-02-26 14:12:00) [3]

Ладно, упарился, поже что нельзя. Отсортирую... пошло оно nax }8(


KreeS   (2006-02-26 13:13:00) [4]


> Дальние полупрозрачные полигоны перекрывают ближние чтоли?

Именно это я и хотел сказать. Но нельзя ли решить эту проблему без сортировки, чтобы это выглядело примерно так:
for i := 0 to N do
 объект[i].нарисовать(x, y, z);
и чтобы он понимал, что может стоять за уже нарисованным объектом.
А то ведь я это и делаю только ради того чтобы не сортировать, а если сортировать, то и z-координата уже никакая не нужна.


ancara   (2006-02-26 11:38:00) [5]


> 1. Поэкспериментировал с этим, выяснил, что при таком раскладе
> 1 - будет ближе всех к камере, а -10 дальше. Почему не наоборот?

 Ну так все правильно, ибо по-умолчанию, т.е. после
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;

камера смотрит в отрицательном направлении оси Z.

>  беда 2 иногда случается

 яне совсем понял в чем беда? Дальние полупрозрачные полигоны перекрывают ближние чтоли? Значит надо по глубине сортировать, дальние рисовать первыми, затем ближние...
 А glDepthFunc(GL_ALWAYS) значит что тест глубины будет всегда завершаться положительно, даже если между рисуемым объектом и камерой  есть другие, уже отрендеренные полигоны.  GL_LEQUAL - соответственно означает, что тест пройдут те точки, у которых Z меньше, либо равно того, что записано в depth-buffer'е.


KreeS   (2006-02-26 11:37:00) [6]

вот скриншот бага:
http://www.krees85.narod.ru/temp/shot_01.jpg

тень от нижнего дерева перекрывается прозрачной облатью тени верхнего дерева


KreeS   (2006-02-26 11:13:00) [7]

C glDepthFunc(GL_ALWAYS) ИМХО глубина вообще учитываться перестала, поставил glDepthFunc(GL_LEQUAL) стало почти то что надо, но беда 2 иногда случается почему-то.


KreeS   (2006-02-26 10:20:00) [8]


> glOrtho2D(0, Width, Height, 0, -1, 10);

наверно имеется ввиду glOrtho?

1. Поэкспериментировал с этим, выяснил, что при таком раскладе 1 - будет ближе всех к камере, а -10 дальше. Почему не наоборот?

2. Столкнулся с проблемой, когда текстуры с альфа маской перекрывали друг друга прозрачными областями, а некоторые иногда съезжали куда-то в сторону и вообще не мог понять что происходит. Поставил glDepthFunc(GL_ALWAYS); стало нормально. Что вообще значит GL_ALWAYS? :)


grisme   (2006-02-26 05:44:00) [9]


> Кто-нить в курсе какие параметры вида надо установить в
> OGL


Вопрос некорректен.:) Не надо ничего указывать. просто рисуй все "по слоям", т.е. если спрайт выводится в "вверхнем слое", всем полигомам в этом слое присваиваешь координату z=0, если дальше- соответственно z>0 :)


XProger   (2006-02-26 01:37:00) [10]

glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho2D(0, Width, Height, 0, -1, 10);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glEnable(GL_DEPTH_TEST);

Глубина принимает значения -1..10


Наверх

Титульная страница Поиск, карта сайта Написать письмо