Пт, 26 Апр 2024
Механоиды 3
Приветствую Вас Гость | RSS
Главная страница | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Форум "Механоиды 3" » Рабочий раздел. » Графика » Тени и способы их реализации
Тени и способы их реализации
PA3UJIbДата: Пн, 29 Июн 2009, 21:37 | Сообщение # 41
1 Поколение
Группа: Основной состав
Сообщений: 105
Замечания: 0%
Статус: Offline
Quote (Микс)
Походу, некоторым людям надо скачать Microsoft Visual C++ 2008 Redistributable Package. У меня-то самого Microsoft Visual C++ 2008 Express Edition стоит

Извлек из-под стола Экспресс студию - и, о чудо, я могу запустить демки от smt005!

Вопрос, что во второй демке означают красные треугольники под глайдером?

 
smt005Дата: Пн, 29 Июн 2009, 21:54 | Сообщение # 42
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (PA3UJIb)
Вопрос, что во второй демке означают красные треугольники под глайдером?

Это вероятные полигоны над которым летит глайдер, а зелёный, это найденый полигон над которым летит глайдер. Потом положение глайдера расчитывается относительно этого полигона.
 
МиксДата: Вт, 30 Июн 2009, 05:34 | Сообщение # 43
1 Поколение
Группа: Основной состав
Сообщений: 80
Замечания: 0%
Статус: Offline
smt005, чем видео сжимаешь?

 
smt005Дата: Вт, 30 Июн 2009, 16:47 | Сообщение # 44
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Микс)
smt005, чем видео сжимаешь?

Прогой VirtualDub, а лучший кодек вроде MPEG4.

 
МиксДата: Вт, 30 Июн 2009, 17:15 | Сообщение # 45
1 Поколение
Группа: Основной состав
Сообщений: 80
Замечания: 0%
Статус: Offline
Ух ты, круто. surprised
Вот, отснял работу Разиля и мои эксперименты. smile
Прикрепления: demo42009-06-30.avi (511.7 Kb) · AIM32009-06-300.avi (589.8 Kb)


 
PA3UJIbДата: Вт, 30 Июн 2009, 17:38 | Сообщение # 46
1 Поколение
Группа: Основной состав
Сообщений: 105
Замечания: 0%
Статус: Offline
Quote (Микс)
Вот, отснял работу Разиля и мои эксперименты.

У тя водичка есть, и небо крутое. wacko
 
МиксДата: Вт, 30 Июн 2009, 18:02 | Сообщение # 47
1 Поколение
Группа: Основной состав
Сообщений: 80
Замечания: 0%
Статус: Offline
Зато движок малоизменяемый))))

 
smt005Дата: Вт, 30 Июн 2009, 18:18 | Сообщение # 48
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Об этом лучше в другой теме писать, а то и так уже путаница в том где что написано.

Yandersen, ты разбираешся в смешивании текстур ?
Если да, то дай (ты вроде делал уже такое) код который это делает.

 
PA3UJIbДата: Вт, 30 Июн 2009, 19:16 | Сообщение # 49
1 Поколение
Группа: Основной состав
Сообщений: 105
Замечания: 0%
Статус: Offline
Какое именно смешивание тебя интересует? Простенькое и шейдерами мона организовать.
 
smt005Дата: Вт, 30 Июн 2009, 20:02 | Сообщение # 50
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Сперва простенькое.

Шейдеры потом.

 
YandersenДата: Чт, 02 Июл 2009, 23:07 | Сообщение # 51
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Yandersen, ты разбираешся в смешивании текстур ?
Если да, то дай (ты вроде делал уже такое) код который это делает.
Чессгря, т.к. юзаю исключительно лишь стандартно-даваемые gl.h и glu.h, причём первых версий, то расширение ARB мне не доступно, и, соответственно, мультитекстурирование тоже. Так что я, упрощённо говоря, просто рисую один и тот же треугольник несколько раз, но с разными текстурами, делая те или иные вершины прозрачными.
Разрешить смешивание (Blending) можно прописав:
glEnable(GL_BLEND);
Затем нужно определить способ смешивания. Он настраивается функцией glBlendFunc.
Самый распространённый метод - glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA), но это не лучший вариант для мультитекстурирования.

Опишу способ, как покрыть треугольник тремя плавно переходящими друг в друга текстурами.
0) Функция НЕрисования полностью прозрачных пикселов, хотя и логична для использования всегда, но сейчас может помешать, так что отрубим, если включена:
glDisable(GL_ALPHA_TEST);
Также нам временно нужно отключить смешивание:
glDisable(GL_BLEND);
Кстати, мы можем временно отрубить ещё и свет, текстурирование и всё остальное, что нужно для красоты:
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
1) Первый цикл особый, он необходим для "рисования" невидимой подложки. С отключенным блендером и тестом прозрачности, даже чёрные полностью прозрачные пикселы будут заменять пикселы любого цвета, уже находящиеся в буффере кадра:
glColor4f(0,0,0,0);
glBegin(GL_TRIANGLES);
glVertex3fv(v1);
glVertex3fv(v2);
glVertex3fv(v3);
glEnd();
Смысл рисования подложки - обнуление пикселов, на которых находится мультитекстурный объект, что необходимо для корректного смешивания текстурных слоёв, а также определение его формы (короче, заполнение буфера глубины).
2) Теперь мы врубим всё обратно и нарисуем наш трёхтекстурный треугольник три раза, каждый раз привязывая одну из трёх текстур, и делая одну из вершин непрозрачной, а все остальные - прозрачными. Так мы смешаем три текстуры, сделаем их плавно-переходящими друг в друга:
а. Врубаем всё обратно:
glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
б. Врубаем смешивание и настраиваем его особым образом, заставляя приходящие пикселы домнажаться на свою Альфу и тупо суммироваться с уже находящимися в буффере:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
в. Важный, но трудно-понимаемый-сходу момент - для правильного смешивания нужно ограничить рисовку лишь теми местами, где есть подложка. Другими словами, нужно настроить буфер глубины так, чтобы рисовались лишь те пикселы, глубина которых совпадает с уже отрисованными невидимыми пикселами подложки:
glDepthFunc(GL_EQUAL);
г. Ну вот тепрь мы готовы три раза отрисовать треугольник, покрывая его разными текстурами:

glBindTexture(GL_TEXTURE_2D, tex1);
glBegin(GL_TRIANGLES);
glColor4f(R,G,B,1); /*glTexCoord, glNormal,...*/ glVertex3fv(v1);
glColor4f(R,G,B,0); /*glTexCoord, glNormal,...*/ glVertex3fv(v2);
glColor4f(R,G,B,0); /*glTexCoord, glNormal,...*/ glVertex3fv(v3);
glEnd();

glBindTexture(GL_TEXTURE_2D, tex2);
glBegin(GL_TRIANGLES);
glColor4f(R,G,B,0); /*glTexCoord, glNormal,...*/ glVertex3fv(v1);
glColor4f(R,G,B,1); /*glTexCoord, glNormal,...*/ glVertex3fv(v2);
glColor4f(R,G,B,0); /*glTexCoord, glNormal,...*/ glVertex3fv(v3);
glEnd();

glBindTexture(GL_TEXTURE_2D, tex3);
glBegin(GL_TRIANGLES);
glColor4f(R,G,B,0); /*glTexCoord, glNormal,...*/ glVertex3fv(v1);
glColor4f(R,G,B,0); /*glTexCoord, glNormal,...*/ glVertex3fv(v2);
glColor4f(R,G,B,1); /*glTexCoord, glNormal,...*/ glVertex3fv(v3);
glEnd();

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

П.С.: не поняв принцип работы glBlendFunc не сможешь полупрозрачные объекты фигачить. Изучи бибязательно! wink


[Беженец со Скаев]

Сообщение отредактировал Yandersen - Чт, 02 Июл 2009, 23:15
 
smt005Дата: Пт, 03 Июл 2009, 00:44 | Сообщение # 52
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Не, такой метод не пойдёт, несколько раз перерисовывать слишком неэффективно.

Quote (Yandersen)
юзаю исключительно лишь стандартно-даваемые gl.h и glu.h, причём первых версий

Я продолжаю не понимать тебя, почему такая позиция?
Использовать возможности расширений видеокарт (или как там правильно говорить)
я ещё не научился , но уже понял что это необходимо и использование только этих библиотек, это то же самое что использовать "Direct1X" И что значит "стандартно-даваемые" ? Если я не ошибаюсь, сейчас OpenGL устанавливается на комп аналогично Direct.

Quote (Yandersen)
glBlendFunc ............. Изучи бибязательно!

Уже изучил и уже успел забыть, Ыыыы wacko
 
YandersenДата: Пт, 03 Июл 2009, 06:55 | Сообщение # 53
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Не, такой метод не пойдёт, несколько раз перерисовывать слишком неэффективно.
Если придумаешь лучший, поделись. wink
Quote (smt005)
Я продолжаю не понимать тебя, почему такая позиция?
Флэшбэки:
Quote (Frozen_Light)
Твои творения так и не запустились.

Quote (smt005)
И что, у всех так ?

Quote (smt005)
А какие у вас видеокарты и операционки ?

Quote (smt005)
Я продолжаю не понимать тебя, почему такая позиция?
Для совместимости. Хочу быть уверен, что мой ехе-шник включает в себя всё, что ему нужно, не требует таскания с собой дополнительных библиотек, и пойдёт на любом компе, хоть без видюхи, как мой ноут. happy

Добавлено (03 Июл 2009, 05:11)
---------------------------------------------

Quote (smt005)
Уже изучил и уже успел забыть, Ыыыы
Думаешь, я всё наизусть помню? Постоянно юзаю этот справочник.

Добавлено (03 Июл 2009, 06:55)
---------------------------------------------
smt005, посмотрел твой код. Во-первых, стандартными библиотеками твой метод нереализуем, поскольку должно суппортаццо ARB-расширение. Во-вторых, если я всё правильно понял, то в результате создания теневой текстуры она охватит лишь некоторую усечённую пирамиду пространства; где гарантия, что при рендеринге из положения наблюдателя, в буфер кадра не попадут фрагменты сцены, выходящие за границы этой пирамиды? Эти части сцены не будут затенены? Ну это так, мои не очень осмысленные гадания. Но самое главное (в-третьих): тень реализуется как равномерное затенение (смешивание с чёрным цветом), что хоть и выглядит, как тень, но физически нереалистично для любых блестящих объектов. Дело вот в чём. Основные параметры материала - цвет в тени (GL_AMBIENT), цвет рассеянный (GL_DIFFUSE) и цвет отражения (GL_SPECULAR). В тени никакого отражения (блеска) быть не может, бо лучи от источника не проходят через заслоняющий объект, рассеянный цвет сильно уменьшается, а GL_AMBIENT всё тот же. Т.е. конечный цвет пикселя имеет несколько составляющих, каждая из которых имеет в тени и в свете разный вес. Единственный способ получения реалистичного эффекта - рендерить сцену два раза с разными настройками источника света. А затем определять, где тень, где свет, и выводить фрагменты теневого или светового варианта кадра где положено. Твой метод, похоже, не допускает подобного разделения, бо ты не можешь свою теневую карту фигнуть в буфер трафарета и с его помощью разделить два разноосвещённых кадра. Твой метод допускает лишь равномерное зачернение пикселов по всему объёму тени. На металлах в тени будут блики, но тёмные. Очень реалистично... dry
Ну и в четвёртых, рваные края. Чем дальше источник от наблюдателя, тем хуже они будут выглядеть.
Я всё же советую теневые объёмы - совсем не обязательно тенить всё - можно лишь движущиеся модели. Или настройки сделать:
1) Тенить только модели.
2) Тенить модели, статичные объекты (камни, деревья, здания).
3) Модели, объекты, рельеф (тени от него появляются лишь на закате).
Или можно юзать для тенения упрощённые варианты моделей (их же и для просчёта физики использовать).


[Беженец со Скаев]

Сообщение отредактировал Yandersen - Пт, 03 Июл 2009, 14:01
 
smt005Дата: Пт, 03 Июл 2009, 15:09 | Сообщение # 54
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Если придумаешь лучший, поделись.

Использование расширений. biggrin

Quote (Yandersen)
из положения наблюдателя, в буфер кадра не попадут фрагменты сцены, выходящие за границы этой пирамиды? Эти части сцены не будут затенены?

Над этим надо думать, в тех же Механоидах это как-то решается, надо будет спросить у разработчиков.

Quote (Yandersen)
Но самое главное (в-третьих)
При твоём креативном мышлении (придумывание велосипеда - теневой объём), ты почему-то упорно отказываешься мыслить в пользу "карты тени". Простой способ с использованием blending-а описан в той же книге, минус только в том, что надо отрисовавать два раза.

И самое главное, это же решается в играх, почему ты всё равно говоришь что это нельзя сделать.
Ты же тоже не знаешь, как сделать "юбку" для сложных объектов и как ты будешь делать мягкие тени.

Quote (Yandersen)
Я всё же советую теневые объёмы

Проблема нашего спора в том, что ты пытаешься использовать дедовские методы (чтобы на всех компах работало) а я пытаюсь использовать только новые способы. Способ теневой карты на данный момент поддерживают все видеокарты, а для ноутбуков вообще можно отключать тени, т.к. на такой машине понятие "хорошая графика" отпадает.

Quote (Yandersen)
совсем не обязательно тенить всё
Я не думаю что в играх делают тени для всего. В Мехах тени только от механоидов, а трава не только не отбрасывает тень но даже не затеняется глайдером, т.е., предположительно для каждого глайдера делается своя карта тени.

Добавлено (03 Июл 2009, 14:35)
---------------------------------------------

Quote (Yandersen)
Quote (Frozen_Light)
Твои творения так и не запустились.

Quote (smt005)
И что, у всех так ?

Quote (smt005)
А какие у вас видеокарты и операционки ?

Quote (smt005)
Я продолжаю не понимать тебя, почему такая позиция?
Для совместимости. Хочу быть уверен, что мой ехе-шник включает в себя всё, что ему нужно.

В данном случае OpenGL нипричём, это всё Visual C++ ( PA3UJIb установил С++ и у него всё зароботало), аналогично у тебя, у Микса требовались библиотеки...

Добавлено (03 Июл 2009, 15:09)
---------------------------------------------
Yandersen, а твоим способом реализуется самозатенение ?

 
YandersenДата: Пт, 03 Июл 2009, 22:28 | Сообщение # 55
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Ты же тоже не знаешь, как сделать "юбку" для сложных объектов и как ты будешь делать мягкие тени.
О мягких тенях с моим способом придётся забыть. А "юбка" делается не для объектов, а для примитивов, из которых они состоят. Над этим мне ещё надо немного потрудится, но тупиков тут не предвидется.
Quote (smt005)
Способ теневой карты на данный момент поддерживают все видеокарты, а для ноутбуков вообще можно отключать тени, т.к. на такой машине понятие "хорошая графика" отпадает.
Я на своём ноуте с тенями во вторую контру иногда рублюсь. У меня текстуры сильные тормоза дают. Кстати, во второй контре тени, вроде, твоим способом сделаны.
Quote (smt005)
Yandersen, а твоим способом реализуется самозатенение?
Да. Если объект будет послан на затениние, его тень наложится на всё, что находится в буфере кадра, включая и сам ранее отрисованный объект. А разве твой способ не даёт самозатенения? Если я правильно понимаю, то должен, если тенирующий объект имеет объём, а не простой плоский примитив.

Добавлено (03 Июл 2009, 22:28)
---------------------------------------------

Quote (smt005)
В данном случае OpenGL нипричём, это всё Visual C++ ( PA3UJIb установил С++ и у него всё зароботало), аналогично у тебя, у Микса требовались библиотеки...
Разве не нужно таскать glut.dll вместе с ехе-шником?
Ну вообще, куча дурацких настроек по включению/невключению добра в исполнимый файл есть и в Билдере. Тоже достаёт. Но я с ними кой-как уже разобрался - тыкаешь/убираешь галочку, перекомпилишь, и смотришь, чтобы размер ехе-шника стал больше. biggrin


[Беженец со Скаев]
 
smt005Дата: Сб, 04 Июл 2009, 13:44 | Сообщение # 56
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
А разве твой способ не даёт самозатенения?

Даёт.

Quote (Yandersen)
О мягких тенях с моим способом придётся забыть.

Нуууу, как я понял, приближение к реалистичности тебя не интересует.

Quote (Yandersen)
Кстати, во второй контре тени, вроде, твоим способом сделаны.

Ну дык, способ теневого объёма уже можно в красную книгу записывать.

Quote (Yandersen)
Разве не нужно таскать glut.dll вместе с ехе-шником?

Незнаю. wacko

Добавлено (04 Июл 2009, 13:44)
---------------------------------------------
Я ошибся на счёт того что в AIM1/AIM2/AIMR используется "мой метод", но....

Quote (Spline Добрый разработчик)
Современные методы другие. В последнем проекте используем каскадный shadowmap
 
YandersenДата: Сб, 11 Июл 2009, 05:28 | Сообщение # 57
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
smt005, не подскажешь какую-нить простую обучающую литру для тех, кто НЕ знает, что такое шейдер, но имеет желание это втыкнуть и надеется этим пользоваться, что бы это ни было? Суперкнигу мне открыть так и не удалось. Может, она у тя есть в каком-нить там *.doc или *.pdf форматах?

[Беженец со Скаев]
 
smt005Дата: Сб, 11 Июл 2009, 14:30 | Сообщение # 58
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Книга скорее всего в формате "djvu", для открытия нужна прога DjVu Viewer (внешне напоминающая Adobe Reader), её лекго наити в том же инете.
Quote (Yandersen)
не подскажешь какую-нить простую обучающую литру
Ещё, http://smt005.my1.ru/forum/13-73-1 .
 
YandersenДата: Вс, 12 Июл 2009, 22:43 | Сообщение # 59
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Эх, тормозят теневые объёмы безбожно без аппаратной поддержки... cry Я глянул, удивился - моя АТИйка поддерживает выдавливание теневых объёмов, несколько буферов трафарета и ещё там чё-то - но я ж не квалификанутый системный программер, чтоб аппаратурой пользоваться, да и не универсально это - от видюхи зависеть. Я глянул шейдеры, что на wingman'е описаны - но как я понял, шейдеры не смогут помочь: они могут ковырять отдельные приходящие вершины или пикселы, но на стадии сборки вершин в треуголки нельзя ничего контролировать, а там-то как раз и нужно участие. Жаль.
Вот, в общем, завертел несколько кубиков, почувствовал подтормаживание. Наф теневые объёмы, пока стандартно поддерживаться аппаратно не будут.
Прикрепления: 4035311.exe (495.5 Kb)


[Беженец со Скаев]
 
smt005Дата: Вт, 14 Июл 2009, 21:31 | Сообщение # 60
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Я всё же сделал "прозрачные" тени совмещая с текстурамИ.

Добавлено (14 Июл 2009, 21:31)
---------------------------------------------
Следующий шаг, это оптимизация и улучшение тени.

Прикрепления: 5279179.jpg (21.6 Kb)
 
YandersenДата: Вт, 14 Июл 2009, 23:31 | Сообщение # 61
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
smt005, я за тебя болею, давай! Сорь, сегодня инверсия 4х4 матриц ещё не готова будет - проверил - неверный результ выходит, но уже нет времени доделать. Но завтра обещаю выложить.

[Беженец со Скаев]
 
smt005Дата: Ср, 15 Июл 2009, 00:01 | Сообщение # 62
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Yandersen, не запаривайся, она мне пока не нужна, возможно никогда не понадобится.
 
YandersenДата: Ср, 15 Июл 2009, 01:44 | Сообщение # 63
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Бля, вот так всегда. dry А я доделал. Ну всё равно, не выкидывать же?..

В общем, в хеадере описаны функции по сложению, умножению, транспонированию матриц, вычислению детерминантов и обратных матриц для квадратных матриц 2-го, 3-го и 4-го порядков.
Вот перечень:
1) Функции сложения матриц A и B и записи результата в матрицу S:
inline void SummMatrixes2x2(const float A[4], const float B[4], float *S);
inline void SummMatrixes3x3(const float A[9], const float B[9], float *S);
inline void SummMatrixes4x4(const float A[16], const float B[16], float *S);
2) Функции умножения матриц A и B и записи результата в матрицу M:
inline void MultMatrixes2x2(const float A[4], const float B[4], float *M);
inline void MultMatrixes3x3(const float A[9], const float B[9], float *M);
inline void MultMatrixes4x4(const float A[16], const float B[16], float *M);
3) Функции транспонирования (переворота вокруг главной диагонали) матрицы A и записи результата в матрицу T:
inline void TransposeMatrix2x2(const float A[4], float *T);
inline void TransposeMatrix3x3(const float A[9], float *T);
inline void TransposeMatrix4x4(const float A[16], float *T);
4) Функции, вычисляющие обратную матрицу I для матрицы A:
inline void InvertMatrix2x2(const float A[4], float *I);
inline void InvertMatrix3x3(const float A[9], float *I);
inline void InvertMatrix4x4(const float A[16], float *I);
Надеюсь, "inline" не смущает? Просто пометка компиллятору считаь функцию как макрос - это быстрее работает. Не все функции можно так объявить, но те небольшие, где всякие там сложения да умножения, позволительно.
5) Вычисление детерминанта матрицы:
Determinant2x2(M)
Determinant3x3(M)
Determinant4x4(M)
Эти три - просто макросы:
float M[16];
float DetM = Determinant4x4(M);

З.Ы.: все функции считают, что матрицы сохранены по-столбцам - в таком формате OpenGL их использует, так что учитывая эту область применения, я обеспечил совместимость.

Прикрепления: Matrices.h (6.4 Kb)


[Беженец со Скаев]
 
smt005Дата: Ср, 15 Июл 2009, 02:51 | Сообщение # 64
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
А я доделал.

Будем иметь в виду.
 
YandersenДата: Ср, 15 Июл 2009, 10:08 | Сообщение # 65
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Следующий шаг, это оптимизация и улучшение тени.
Кстати, насчёт этого. Cascaded shadow map - это твой же метод, просто там не одну, а несколько карт теней рисуют - одну для всей локации в целом, вторая охватывает меньшую часть локации, но ближе к наблюдателю, третья - ещё ближе к наблюдателю и для ещё меньшей части локации и т.д. Так получается примерно одинаковая зазубренность на всех объектах за счёт увеличения детализации тени при приближении к наблюдателю. Действительно хороший результ выходит, только, сам понимаешь, рисуется кратно медленнее. Но даже два каскада уже сильно повышают красоту.
Но бля, ИМХО, это путь в никуда! Сколько видеопамяти засирается этими картами теней! И чем больше разрешение экрана, тем больше должен быть размер карты тени, и за гонкой к убиранию квадратиков размер теневой карты тоже будет расти. Как я хочу дожить до "Ray-Tracing в массы! moil "


[Беженец со Скаев]
 
smt005Дата: Ср, 15 Июл 2009, 13:34 | Сообщение # 66
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Cascaded shadow map - это твой же метод

Основной принцип такой, но как это на практике, мне неизвестно, а летература на англицком. biggrin Пока я прочитаю эти несчастные 13 страниц, проёдёт неделя...
Мой принцип похож, но появился ряд проблем. Я думал делать для каждого квада свою карту тени, но дело в том что на этот квад может падать тень с другого квада...

Добавлено (15 Июл 2009, 13:24)
---------------------------------------------

Quote (Yandersen)
Как я хочу дожить до "Ray-Tracing в массы!

А я хочу дожить до того момента когда можно будет ходить по Марсу и Луне! cool biggrin

Добавлено (15 Июл 2009, 13:34)
---------------------------------------------

Quote (Yandersen)
рисуется кратно медленнее

Предположительно, падение FPS не больше чем в два раза из-за того чтосчена рисуется два раза.
Quote (Yandersen)
Но бля, ИМХО, это путь в никуда!

Смотри реально, в Краизисе и других играх, как по твоему делаются тени на всю локацию ?
Quote (Yandersen)
Сколько видеопамяти засирается этими картами теней!
Не больше чем одна большая текстура.
Если отбросить математическую точность, то сумма количества пикселей текстур низкого качества, равна количествупикселей ближайшей текстуры. Следовательно, на деле объём текстур равен 2-3 текстуры хорошего качества, что не много.
 
YandersenДата: Ср, 15 Июл 2009, 17:37 | Сообщение # 67
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Да я не спорю - шэдоу мапы - лучший метод щас. Если смотреть относительно. А если абсолютно, то гланды через Ж.
Quote (smt005)
Мой принцип похож, но появился ряд проблем. Я думал делать для каждого квада свою карту тени, но дело в том что на этот квад может падать тень с другого квада...
Не-не-не, по квадам низзя. Нуна только по наблюдателю равняться, по его пирамиде зрения. Там стопудово математика будет, но в примерах же это есть, вроде? Хотя подождь: ты что, мапу только одного квада выбираешь и накладываешь? А что, несколько мапов с нескольких квадов низзя?


[Беженец со Скаев]
 
smt005Дата: Ср, 15 Июл 2009, 18:39 | Сообщение # 68
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
А если абсолютно, то гланды через Ж.

А чем он хуже теневого объёма, мне так теневой объём через Ж, а карта тени логична, что не освещается, то "НЕотображается".
Quote (Yandersen)
А что, несколько мапов с нескольких квадов низзя?

Незнаю, ещё не разобрался.
 
YandersenДата: Ср, 15 Июл 2009, 20:23 | Сообщение # 69
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
А чем он хуже теневого объёма, мне так теневой объём через Ж, а карта тени логична, что не освещается, то "НЕотображается".
В теории - да, ежу понятно. Но понимаешь ли ты весь код, который это производит, или просто юзаешь его, как мартышка? Я несколько раз пробовал, но так и не впёр. А до теневого объёма я сначала сам допёр, бо это физически ясная модель - тень как реально-существующая объёмная фигура, треугольная призма за каждым из треугов, и координаты этой призмы легко считаются. Единственный мутный момент - как ретрансформировать координаты светильника в текущую объектную систему координат, но это я тоже сам осилил. Вот только не я должен этой простой и нудной операцией заниматься на проце, пересылая в несколько раз больше координат вершин, высчитывая то, что без проблем и во много раз быстрее может сделать видеокарта, если бы в OpenGL была такая возможность.


[Беженец со Скаев]
 
smt005Дата: Чт, 16 Июл 2009, 03:50 | Сообщение # 70
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Самому додумать трудно если не нереально, но когда понимаеш как это делается, то вполне понятно. Вот пример из кники "OpenGL суперкнига".
Немного изменил для себя.

Добавлено (16 Июл 2009, 03:50)
---------------------------------------------
С использованием шейдера немного по другому (там даже понятней), но принцип тот же.

Прикрепления: ShadowMap.txt (6.3 Kb)
 
YandersenДата: Чт, 16 Июл 2009, 17:09 | Сообщение # 71
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Чуток понятней стало. И экстенженов тут не видно. Хотя подождь, а как рендерится сцена с тенями? Привязывается теневая текстура в мультитекстурном режиме? Можешь пример простой кода показать?

Кстати,

Quote (smt005)
// Цвет за пределами текстуры - НЕработает smile
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, ( 1.0f, 1.0f, 1.0f, 1.0f) );

ну так ты ж не запрашиваешь наличия у текстуры самого бордера! А это делается при создании текстуры функцией glCopyTexImage2D (последний аргумент - ширина бордера, он в твоём примере нулю равен).


[Беженец со Скаев]
 
smt005Дата: Чт, 16 Июл 2009, 17:09 | Сообщение # 72
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
glSelectBuffer glRenderMode glInitNames glLoadName

Да, надо сперва их ещё изучить.

Квады надо оставить на потом.

Quote (Yandersen)
рендерить нужно будет не как квадраты

Тогда пока ничего в этом направлении не делай.

http://developer.download.nvidia.com/SDK....aps.pdf
Вот, если хочеш почитай это, потом мне раскажеш.

А тоя читаю, но медленно и не всё понимаю, даже если все слова известны.

 
YandersenДата: Чт, 16 Июл 2009, 17:09 | Сообщение # 73
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Вот, если хочеш почитай это, потом мне раскажеш.
Это я читал, кстати. Но сорь, на пальцах теория ясна, на практике применение - увы, мои извилины не настолько кривы. smile


[Беженец со Скаев]
 
smt005Дата: Чт, 16 Июл 2009, 17:09 | Сообщение # 74
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Раскажи в кратце.
Мне интересно, для каждой карты тени рендерится кусок карты или както по другому?
 
YandersenДата: Чт, 16 Июл 2009, 17:09 | Сообщение # 75
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Quote (smt005)
Раскажи в кратце.
Мне интересно, для каждой карты тени рендерится кусок карты или както по другому?

"Render the scene from the camera’s point of view. Depending on the
fragment’s z-value, pick an appropriate shadow map to the lookup into."

Как я понимаю, это должно шейдером делаццо - когда рендерится сцена с тенями, шейдер должен проверять значение глубины рисуемого пикселя, и в зависимости от этого выбирать соответствующую карту тени.

Но вообще, ты знаешь, я со всего этого под стол сползаю, и там молюсь о рей-трейсинге. wacko

//---

Кстати, я тут думнул насчёт того, почему при размерах текстуры теневой карты близких к разрешению экрана, кубичность видна возле наблюдателя. И вот до чего допёр. К примеру, источник вертикально сверху, наблюдатель смотрит горизонтально.

Из положения источника света пирамида видимости наблюдателя - трапеция (почти треугольник). И что выходит? возле наблюдателя лишь несколько пикселей теневой текстуры используются, а остальные, не попадающие в пирамиду - мусор. Оттого и кубичность - текстура нерационально юзается. Так вот я твой пример кода посмотрел, и думнул: там ведь тупо используются матрицы проекции и модельвью для умножения на матрицу текстуры. Какая матрица проекции была использована при рендере теневой карты(как была настроена трансформация перспективы) - поф. Так значит, если расфлюстратить матрицу проекции так, чтобы исказить параллельное пространство в трапеционное ( biggrin ), то можно в квадратный вьюпорт отрендерить пирамиду пространства видимости наблюдателя, а не просто тупо куб, эту пирамиду включающий. Do you know, what I mean? wink Тогда и кубичность исчезнет, и одной шэдоу-мапы размером с экран будет достаточно. happy Сушь, я уже заинтересовался чутка - припёрло с матрицами поиграться, авось выйдет? surprised Тока помоги склепать программульку, дай общий пример кода рендера сцены с шэдоу-мапой, как ты дал пример составления и рендера шэдоу-мапы. wink

Прикрепления: 0825608.gif (2.0 Kb)


[Беженец со Скаев]
 
smt005Дата: Пт, 17 Июл 2009, 13:50 | Сообщение # 76
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Попробуй рендерить сцену с перспективой от другой камеры.
Или наложить текстуру в треугольной форме.

Я тоже попробую.

Но думаю что что-то в этом способе не получится.
Придумали каскадную карту тени, даже мануалы от производителей есть, а про этот способ ничего не сказанно. Неужеле никто до этого не додумался?........................................

Добавлено (17 Июл 2009, 13:41)
---------------------------------------------

Quote (Yandersen)
рендерится сцена с тенями?

Совершенно так же как объчная сцена.

Quote (Yandersen)
Привязывается теневая текстура в мультитекстурном режиме?

Нет, просто, биндится текстура тени.

Quote (Yandersen)
Можешь пример простой кода показать?
Quote (Yandersen)
Тока помоги склепать программульку, дай общий пример кода рендера сцены


glBindTexture(GL_TEXTURE_2D, ShadowTexture); // - выбор требуемой

glBegin (GL_POLYGON);
glVertex3f( -1.5f, 1.0f, 0.0f);
glVertex3f( -1.5f, -1.0f, 0.0f);
glVertex3f( 1.5f, -1.0f, 0.0f);
glVertex3f( 1.5f, 1.0f, 0.0f);
glEnd ();

glBegin (GL_POLYGON);
............................
glEnd ();

Добавлено (17 Июл 2009, 13:43)
---------------------------------------------
Можно тупо, без всяких ЛоадЭдентити и т.д.
В зависимости от сложноти сцены, соответственно.

Добавлено (17 Июл 2009, 13:50)
---------------------------------------------
Пример в том текстовом файле, тебе надо будет только создать переменные, настроить положения камеры(света и наблюдателя gluLookAt(...)) и простейшую сцену(выше показанно).

 
YandersenДата: Пт, 17 Июл 2009, 19:34 | Сообщение # 77
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Тпрру!
Это что ж, все объекты будут отрендерены лишь с одной текстурой - текстурой тени? Свою текстуру нельзя будет накладывать? Или всё же тут мультитекстурирование подразумевается как лучший вариант?

//---

Я тут ударился в рэй-трейсинг. Клепаю эмулятор.


[Беженец со Скаев]
 
smt005Дата: Чт, 23 Июл 2009, 02:20 | Сообщение # 78
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Это что ж, все объекты будут отрендерены лишь с одной текстурой - текстурой тени? Свою текстуру нельзя будет накладывать? Или всё же тут мультитекстурирование подразумевается как лучший вариант?
Да, чтобы была тень и текстура, нужно использовать мультиплексирование.

Quote (Yandersen)
Я тут ударился в рэй-трейсинг. Клепаю эмулятор.
Для чего?
Ты хочеш делать игру или просто програмить без пользы ?

Добавлено (23 Июл 2009, 02:20)
---------------------------------------------
Yandersen, как у тебя делп с матрицами, для тени ?

 
YandersenДата: Чт, 23 Июл 2009, 14:18 | Сообщение # 79
1 Поколение
Группа: Доверенные
Сообщений: 196
Замечания: 0%
Статус: Offline
Ещё пока на практике не пробовал - я щас класс TSurface дофигачиваю - но теория уже сформировалась и накопилась парочка вспомогательных функций по вытягиванию из матрицы перспективы параметров AspectRatio, tanA2 (тангенс половинного угла зрения), а также реальных расстояний до плоскостей отсечения (zNear и zFar). Беря в учёт модельновидовую матрицу, смогу независимо высчитывать пирамиду видимости, которую решил считать конусом ( wink ). Предположительно, алгоритм для рендера теневой карты будет такой: сперва в коде обычного рендера сцены нужно будет установить наблюдателя в то положение, в котором сцена будет отрендерена нормально. Затем, не рисуя ничего, сразу прерваться на вызов функции по рендеру теневой карты, не давая никаких параметров на вход - все нужные данные будут вытянуты из текущих значений матриц, т.е. функция рендера тени будет независимой и будет восстанавливать предыдущие значения матриц после своего прогона.
Далее, самое главное. Представь конус, вершина которого - положение наблюдателя, а центр основания - точка обзора наблюдателя, но расположенная на максимальном удалении от него - лежит на дальней плоскости отсечения. Радиус основания конуса - половина диагонали нижнего большого основания пирамиды видимости. Таким образом, я описываю щас конус, внутри которого вписана пирамида видимости. Если при рендере теневой карты из положения источника света мы поместим камеру так, чтобы в экран влезал весь конус видимости, и немного исказим матрицу проекции так, чтобы лишнего во вьюпорт влезало по-минимуму, мы получим идеальную оптимальную карту теневой текстуры. Итак, светильниковую камеру необходимо установить в положение источника света, развернув макушкой в направлении положения наблюдателя, и направив в точку, лежащую на линии взгляда наблюдателя - основной принцип: точка "положение наблюдателя" должна встать в центр верхней границы вьюпорта, а линия взгляда наблюдателя должна пройти вертикально по центру от верхней границы вюпорта к нижней. Дело за малым - подвинтить матрицу проекции так, чтобы при Yeye=0 (y-координата точек во вьюпорте; при нуле точка проецируется на самый верхний ряд пикселов вьюпорта) любой Xworld = 0*Xworld*Pmatrix (Xeye), а при Yeye=1 (нижний ряд пикселов вьюпорта) Xeye = 1*Xworld*Pmatrix. Т.е. нужно маштабировать горизонтальную координату приходящих во вьюпорт точек так, чтобы "исказить параллельное пространство в треугольное", соответствующее спроецированному конусу видимости.
wacko
Я б на твоём месте нифика не понял. Ну, в общем, теория есть, короче. Осталось дожить до практики. happy


[Беженец со Скаев]
 
smt005Дата: Пт, 24 Июл 2009, 00:55 | Сообщение # 80
Admin
Группа: Администраторы
Сообщений: 936
Статус: Offline
Quote (Yandersen)
Я б на твоём месте нифика не понял.

Я ничего и не понял!
Сегодня утром ещё раз почитаю.

Добавлено (24 Июл 2009, 00:55)
---------------------------------------------

Quote (Yandersen)
TSurface

Что он делает ?
 
Форум "Механоиды 3" » Рабочий раздел. » Графика » Тени и способы их реализации
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:


Хостинг от uCoz