![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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