Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Проекты > Проекты C++

Ответ
 
Опции темы
Старый 21.05.2015, 16:08   #886
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: [TrueHorror] - разработка

Можно попробовать даже Self-Shadowed Radiosity Normal Mapping. В игре чел ходит с фонарём или зажигалкой по темной пещере так что свет падает под острым углом к поверхности, так что самозатенение бампа весьма кстати.
Проблема только в том что для генерации нужны также и карты высот, а Wegox делает сразу лоу-поли и ищет подходящие нормал-карты. Найти соответствующие друг-другу нормал-карты и карты высот и так чтобы они подходили к общей геометрии не так-то просто. Применение эффекта с неправильными картами скорее только ухудшит общий результат рендеринга.

Оно будет таким же если я узнаю формулу затухания света, используемую в максе.
Не только, ещё зависит от разного рода коэффициентов в шейдерах спекуляра, бампа и т. п. Так что не так всё просто. Обычно этим занимаются дизайнеры или художники умеющие правильно "освещать" рисуемые объекты. Наверное даже с PBR будет меньше проблем, так как там вполне конкретные формулы и меньше возможности неправильно настроить.
(Offline)
 
Ответить с цитированием
Старый 29.05.2015, 18:57   #887
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

Появилось еще немного времени на игрушку. Недавно скачал юнити 5, поковырял новый гуй, и понял что хочу такой же. Действия кнопочек\слайдеров\радиокнопок выполняются через делегаты, но в цпп нет делегатов. Пришлось запилить.

class ruIContainer {
public:
    virtual ~ruIContainer() {    

    };

    virtual void Call() = 0;
};

template< class T, class M > class ruContainer : public ruIContainer {
private:
    T * mClass;
    M mMethod;
public:
    explicit ruContainer( T * theClass, M  theMethod ) : mClass( theClass ), mMethod( theMethod ) {

    };

    virtual void Call() {
        (mClass->*mMethod)();
    }
};

class ruDelegate {
private:
    ruIContainer * mContainer;
public:
    ruDelegate() : mContainer( nullptr ) {

    };
    ~ruDelegate() {
        if( mContainer ) {
            delete mContainer;
        }
    }
    ruDelegate( const ruDelegate & other ) {
        mContainer = other.mContainer;
        (const_cast<ruDelegate&>(other)).mContainer = nullptr;
    }
    template< class T, class M > static ruDelegate Bind( T * theClass, M  theMethod ) {
        ruDelegate delegat;
        delegat.mContainer = new ruContainer< T, M >( theClass, theMethod );
        return delegat;
    }
    void Call() {
        if( mContainer ) {
            mContainer->Call();
        }
    }
    void operator = ( const ruDelegate & other ) {
        mContainer = other.mContainer;
        (const_cast<ruDelegate&>(other)).mContainer = nullptr;
    }
};

class ruEvent {
private:
    vector<ruDelegate> mListenerList;
public:
    void AddListener( const ruDelegate & delegat ) {
        mListenerList.push_back( delegat );
    }

    void RemoveAllListeners() {
        mListenerList.clear();
    }

    void DoActions() {
        for( auto iter = mListenerList.begin(); iter != mListenerList.end(); iter++ ) {
            iter->Call();
        }
    }
};
Пользуюсь так
... где-то внутри класса Menu
button.AddListener( ruDelegate::Bind( this, &Menu::OnButtonClick ));
Плюсы делегатов для гуя можно перечислять долго, но от себя скажу, что с ними я запилил модальные окна для вопросов, анимацию элементов меню и много еще чего. И все очень удобно, не нужно городить неведомый спагетти-код.

Немного скриншотов, графон в гуй не завезли - и скрины заболели джпегом. Кстати последние скрины с исправленным хдр и без него.
Миниатюры
Нажмите на изображение для увеличения
Название: TheMine 2015-05-29 17-58-08-70.jpg
Просмотров: 691
Размер:	66.3 Кб
ID:	21745  Нажмите на изображение для увеличения
Название: TheMine 2015-05-29 17-58-21-39.jpg
Просмотров: 670
Размер:	68.7 Кб
ID:	21746  Нажмите на изображение для увеличения
Название: TheMine 2015-05-29 17-58-28-48.jpg
Просмотров: 656
Размер:	69.7 Кб
ID:	21747  Нажмите на изображение для увеличения
Название: TheMine 2015-05-29 17-58-35-43.jpg
Просмотров: 659
Размер:	70.2 Кб
ID:	21748  Нажмите на изображение для увеличения
Название: TheMine 2015-05-29 17-59-49-82.jpg
Просмотров: 697
Размер:	66.3 Кб
ID:	21749  

Нажмите на изображение для увеличения
Название: TheMine 2015-05-29 17-59-51-50.jpg
Просмотров: 688
Размер:	87.0 Кб
ID:	21750  Нажмите на изображение для увеличения
Название: TheMine 2015-05-29 18-02-00-10.jpg
Просмотров: 670
Размер:	121.5 Кб
ID:	21751  Нажмите на изображение для увеличения
Название: TheMine 2015-05-29 18-02-17-97.jpg
Просмотров: 704
Размер:	121.1 Кб
ID:	21752  
__________________

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо mr.DIMAS за это полезное сообщение:
FREE MAN (29.05.2015), Samodelkin (29.05.2015)
Старый 29.05.2015, 20:04   #888
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: [TrueHorror] - разработка

с ними я запилил модальные окна для вопросов
То есть проблема активных элементов решена и можно перекрывать одними окнами другие при этом управление будет захватывать только активное окно? В том числе и перехватывать управление с персонажа, если я вожу курсор то перс не поворачивается?
(Offline)
 
Ответить с цитированием
Старый 29.05.2015, 20:15   #889
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

Не понял вопрос. Модальное "окно" это на скрине в менюшке по центру. Фокуса у "окон" все равно нет - ибо это не окно, в привычном понимании. Ну если фокус слетит с главного окна приложения, то перс все равно будет поворачиваться и мышка в меню будет ездить. Чтобы это убрать, мне надо выпилить DirectInput из движка и юзать сообщения окна и RawInput для получения скорости мыши.
__________________

(Offline)
 
Ответить с цитированием
Старый 29.05.2015, 21:01   #890
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: [TrueHorror] - разработка

Речь идёт об окнах GUI. Модальным называется окно, которое блокирует работу приложения, пока от пользователя не будет получен ответ. Это значит, что пока пользователь не нажмёт Да или Нет (или другую доступную кнопку), то он не сможет переключиться на любое другое окно (или в случае игры наверное и продолжить игру не сможет -- хотя тут на усмотрение разработчика). В случае с примером на скрине, главное меню должно быть заблокировано.
(Offline)
 
Ответить с цитированием
Старый 29.05.2015, 21:38   #891
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

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

(Offline)
 
Ответить с цитированием
Старый 29.05.2015, 21:55   #892
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: [TrueHorror] - разработка

Возможно в данном конкретном случае блокировать и не надо, но этот механизм нужен для структуризации интерфейсов. Если для каждого окна прописывать что блокируется а что нет, то по мере увеличения количества окон код будет увеличиваться в геометрической прогрессии. Я подумал что раз ты начал делать делегаты, то видимо хочешь создать какой-то задел, чтобы в более сложных играх, например RPG создавать сложные интерфейсы, тогда понабиться универсальный подход, предусматривающий работу с перекрытием и иерархией окон, не усложняющий и не увеличивающий размер кода в зависимости от количества окон. Такой же как с делегатами -- они же теперь универсальные и работают с любым количеством действий.
(Offline)
 
Ответить с цитированием
Старый 29.05.2015, 22:04   #893
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

Действительно, надо будет сделать перекрытие и блокировку окон.
__________________

(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 16:03   #894
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

Понадобились освещаемые частицы. И сразу затык с блендингом словил. Мне нужно отрендерить частицы с аддитивным блендингом для правильного освещения, и в то же время нужно чтобы частицы использовали альфа канал. Если я рендерю с аддитивным - то альфа не учитывается, если учитываю альфу( D3DRS_SRCBLEND = D3DBLEND_SRCALPHA, D3DRS_DESTBLEND = D3DBLEND_INVSRCALPHA ) - то с каждым новым источником света частицы становятся темнее. Что я делаю не так? Может рисовать частицы в текстуру и потом их уже аддитивно рендерить на экран?
__________________

(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 16:21   #895
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: [TrueHorror] - разработка

Попробуй srcBlend = srcAlpha, destBlend = one. Типа умножил цвет на альфу и сложил с экраном.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 16:41   #896
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: [TrueHorror] - разработка

http://techblog.floorplanner.com/ren...rred-pipeline/
Для частиц самое то, только надо их разбивать на не пересекающиеся группы, и рисовать каждую группу за раз.
(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 16:55   #897
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

С таким блендингом работает, но прозрачность частицы почему-то зависит от освещенности.

Код шейдера http://pastebin.com/h6qP2BKp
__________________

(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 17:02   #898
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: [TrueHorror] - разработка

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

с каждым новым источником света частицы становятся темнее. Что я делаю не так?
такого быть не должно - хз что не так. В шейдере у тебя один лайт.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 17:03   #899
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: [TrueHorror] - разработка

Ну так аддитивный мне нужен для множества лайтов.
Дым всякий надо рисовать с обычным блендом.
А освещение?
__________________

(Offline)
 
Ответить с цитированием
Старый 31.05.2015, 17:43   #900
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: [TrueHorror] - разработка

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

дешёвый вариант, который иногда вполне канает: считаешь среднее освещение приходящее в середину каждого альфа-объекта в виде сферической гармоники или просто с 6 сторон, типа сумма saturate(dot(lightN, vec)), где vec = float3(1,0,0), float3(-1,0,0), float3(0,1,0) итд. Потом рисуешь форвардом альфа-объекты, применяя одну гармонику/куб света на весь объект.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com