forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Как сделать правильнее (http://forum.boolean.name/showthread.php?t=16203)

Colossus 17.01.2012 22:30

Ответ: Как сделать правильнее
 
буду изучать говнорисование в текстуру

Mr_F_ 17.01.2012 23:08

Ответ: Как сделать правильнее
 
да это вообще беспонтовый способ, т.к. текстур не напасёшься на весь уровень.
я делал декали аля хл2, остался код на ксорсе/с++, но он слишком уж говнокод, так что смысла постить его особо нет, в теории работало так:


- мы выстрелили в объект, у нас есть позиция появления декали и нормаль поверхности в этом месте/альтернативно это может быть нормаль полёта пули.
- представляем 4 бесконечных плоскости, равноудалённые от позиции дырки и образующие квадрат размером с декаль, если смотреть в направлении нормали. т.е. по сути это квадрат в пространстве нормали, но вытянутый в глубину бесконечно.
- находим все треугольника объекта, попадающие внутрь этих плоскостей, по дистанции и разнице нормалей ещё можно отсеять повернутые обратной стороной трианглы или слишком далёкие от точки попадания.
- обрезаем найденные трианглы нашими 4мя плоскостями и отодвигаем их чуть-чуть в направлении их нормалей (чтобы избежать z-fighting)
- в пространстве нормали считаем планарные UV на трианглы (там тупо U=X, V=Y + нормализация)
- рисуем полученный меш

- можно объединять все декали одного типа на одном объекте в один меш
- можно не обрезать трианглы и не считать UV, а получать UV в пиксельном шейдере + юзать режим аддресации BORDER, но это потенциально ведёт к overdraw + не особо позволяет сфигачить кучу декалей в 1 меш.

- можно юзать deferred decals (?? не пробовал)

- вышенаписанная фигня про треугольники можнт звучать МЕДЛЕННО, но на практике работало, и я не замечал снижения фпс ваще.

Colossus 19.01.2012 09:09

Ответ: Как сделать правильнее
 
дабы не постить 100500 тем, спрошу сдесь же - как можно увеличить громкость 3dsound в блице? а то сделал 3д звук, а он какой то тихи даже вблизи... не я конечно знаю о команде
Код:

SoundVolume
но все равно тихо, что посоветуете?

Платон Александрович 19.01.2012 12:03

Ответ: Как сделать правильнее
 
интересная тема :)

Mr_F_ +1

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

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

кстати по поводу способа с копированием и обрезкой геометрии, там тоже проблем полно, например

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

мне в голову приходит только один вариант - сначала обрезать выбраные треугольники плоскостями других выбраных, а потом уже резать боксом
если есть какие-нибудь другие идеи, буду рад их выслушать

ЗЫ
Цитата:

представляем 4 бесконечных плоскости, равноудалённые от позиции дырки и образующие квадрат
кстати по рисунку также можно понять почему резать лучше боксом, а не квадратом

Nerd 19.01.2012 14:15

Ответ: Как сделать правильнее
 
Цитата:

Сообщение от Colossus (Сообщение 217205)
как можно увеличить громкость 3dsound в блице? а то сделал 3д звук, а он какой то тихи даже вблизи... не я конечно знаю о команде
Код:

SoundVolume
но все равно тихо, что посоветуете?

1. - изменить сам файл.
2. - поиграться с параметрами CreateListener

Mr_F_ 19.01.2012 14:30

Ответ: Как сделать правильнее
 
Цитата:

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

а насчёт обозначенной на картинке проблемы - да, не подумал о таком.
интересно найти решение.
в голову приходит только безумный вариант - т.к. проблема аналогична проблеме освещения при отсутствии теней, можно в крохотном разрешении (типа 32х32) растеризовать все отобранные треугольники с позиции прожектора декали, рисуя в 2д массив глубину (как при software occlusion culling) и потом сравнить все трианглы с записанной глубиной, узнав, есть ли перекрытие (отсеяв то, что у тебя на картинке красное).
но это чёто уже черезчур тормозно звучит)

Платон Александрович 19.01.2012 16:15

Ответ: Как сделать правильнее
 
Цитата:

Сообщение от Mr_F_ (Сообщение 217217)
ээ я не очень понял. у тебя картинка вроде сбоку?

Ага, сбоку
Цитата:

Сообщение от Mr_F_ (Сообщение 217217)
т.е. декаль как бы там проецируется сверху слева вниз вправо?

Вообще только сверху (пикнули в зеленой точке и проекция по нормали пола), но т.к. декаль заходит частично на стену, то и на нее нужно тоже.
Цитата:

Сообщение от Mr_F_ (Сообщение 217217)
короче оно бы и квадратом так же обрезалось бы.

Не, тогда бы по вертикали скопировалась вся стена (плоскости же бесконечны по нормали), вот примерно как на картинке, в 3д лучше будет видно
так же как и на предыдущей картинке точка пика, 4 плоскости квадрата в пространстве нормали и получаемые вертексы

а если боксом, то стена и по вертикали обрежется как раз по размеру декаля
Хотя может лучше тогда брать плоскости по вектору пика? Но опять таки если пикнем сверху получим такую же картину :(
Цитата:

Сообщение от Mr_F_ (Сообщение 217217)
в голову приходит только безумный вариант - т.к. проблема аналогична проблеме освещения при отсутствии теней, можно в крохотном разрешении (типа 32х32) растеризовать все отобранные треугольники с позиции прожектора декали, рисуя в 2д массив глубину (как при software occlusion culling) и потом сравнить все трианглы с записанной глубиной, узнав, есть ли перекрытие (отсеяв то, что у тебя на картинке красное).
но это чёто уже черезчур тормозно звучит)

Ну тогда уж volume декали юзать :) кажись у Хумуса эту технику видел. Только вот к блицу это не применимо к сожалению, надо как-то по другому извращаться :)
ЗЫ
Точно у хумуса, третья снизу

Mr_F_ 19.01.2012 20:13

Ответ: Как сделать правильнее
 
гляжу, в UE тоже боксом:
http://udn.epicgames.com/Three/UsingDecals.html

думаю дальше по поводу проблемы с декалированием левых мест. что если
- определяем все точки пересечения меша с боксом
- если у нас есть точки с одинаковым XY но разной глубиной в пространстве прожектора - оставляем только самые ближние. это должно выкинуть точки пересечения с низом вертикальной стены и даже низом горизонтальной (не требуется проверка по нормали)
- находим треугольники, которым принадлежат оставшиеся точки пересечения
- обрезаем, делаем UV итд


Часовой пояс GMT +4, время: 21:57.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot