PMG

Форумы по созданию игр
Текущее время: 06 дек 2024 05:57

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: glsl
СообщениеДобавлено: 12 май 2009 09:39 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
Уже довольно много знаю о шейдерах, так вот такая проблема:
Вот этот код отвечает за вызов расчета для очередной лампочки, логично будет если light[i].on!=1 не вызывать расчет для этой лампочки и значит fps должно быть больше, чем если бы эта лампочка была бы включена. Т.е если все лампочки !=1 то расчет вообще никогда не вызывается и fps будет максимальным. Но вот беда - fps минимально - как если бы были включены все лампочки и производился их расчет.
Но визуально всё отлично работает, лампочки включаются и выключаются хорошо, но вот проблема только с фпс - оно постоянное - минимально.
Код:
for(int i=0;i<6;i++)
     {
        if(light[i].on==1)
        {       
           DiffuseSpecular(i,normalTex,eyeVec,lightvec[i],tan,norm,bin,tdif, tspec);
           diffuse += tdif;
           specular += tspec;
        }           
     }

Тут дело явно не в моем шейдере, т.е. если DiffuseSpecular(i,normalTex,eyeVec,lightvec[i],tan,norm,bin,tdif, tspec); заменить на чтото типа sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin((sqrt(sqrt(sqrt(sqrt(sqrt(sqrt(sqrt(sqrt ... )))))))))))))))))))))) то эффект будет таким же - минимальное фпс такое же как если бы всегда рассчитывалась эта формула. В чем тут проблема?!

P.S. Я недавно переставил винду и наконец-то смог войти на форум (раньше не мог)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 12 май 2009 16:17 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Не знаю.
Попробуй убрать DiffuseSpecular. Посмотри как измениться скорость.
Попробуй вызвать вначале DiffuseSpecular один раз, потом два ... Если скорость меняется, значит light[i].on всегда 1.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 12 май 2009 18:16 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
я всё пробовал уже, переменные light[i] правильно забиваются значениями, т.к. я в любой момент могу выключить фонарик или лампы на стене и всё отлично выключается при этом скорость примерно 20 фпс.
если убрать DiffuseSpecular то скорость примерно 80 фпс, если два раза то будет точно меньше, это я уже делал.
Такое впечатление, что шейдер один раз в начале запоминает значения лампочек, а потом просто каждый раз считает DiffuseSpecular, но не добавляет цвет в общую переменную: сюда diffuse += tdif; и сюда specular += tspec;

Код:
for(int i=0;i<6;i++)
{
        if(light[i].on==1)
        {       
           DiffuseSpecular(i,normalTex,eyeVec,lightvec[i],tan,norm,bin,tdif, tspec);
           diffuse += tdif;
           specular += tspec;
        }           
}


Вот например что сделал:простой код вставил в какойто халявные урок по glsl
Код:
if(shininess==128.0)
{
for(int i=0;i<2000;i++)
{
float xx=sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(sin(shininess*i))))))))))));
}
}

при нажатии на специальные клавиши shininess или 128,0 или 150,0 и при этом ничего не меняется, так же тормозит.
а вот если сделать вот так
Код:
if(shininess==128.0)
   gl_FragColor.xyz = decalCol * (dMat * (ambient + diffuse) + sMat * specFactor);

то при если 128,0 то есть картинка если 150,0 то нет картинки.
Не понимаю ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 12 май 2009 22:28 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
У меня еще вопрос. Собрался вот тени делать, хочу с помощью шейдеров. Долго искал, но так и не нашел, что нужно передавать как параметр в шейдр для uniform sampler2DShadow shmap; Ну т.е. если для uniform float aaa; нужно передать float число, а для sampler2DShadow нужно передать проекцию какуюто, но не знаю как ее получить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 13 май 2009 12:24 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
bad_duck писал(а):
я всё пробовал уже, переменные light[i] правильно забиваются значениями, т.к. я в любой момент могу выключить фонарик или лампы на стене и всё отлично выключается при этом скорость примерно 20 фпс.
если убрать DiffuseSpecular то скорость примерно 80 фпс, если два раза то будет точно меньше, это я уже делал.
Такое впечатление, что шейдер один раз в начале запоминает значения лампочек, а потом просто каждый раз считает DiffuseSpecular, но не добавляет цвет в общую переменную: сюда diffuse += tdif; и сюда specular += tspec;


Не знаю, может и так. Попробуй все же развернуть цикл.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 13 май 2009 12:25 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
bad_duck писал(а):
У меня еще вопрос. Собрался вот тени делать, хочу с помощью шейдеров. Долго искал, но так и не нашел, что нужно передавать как параметр в шейдр для uniform sampler2DShadow shmap; Ну т.е. если для uniform float aaa; нужно передать float число, а для sampler2DShadow нужно передать проекцию какуюто, но не знаю как ее получить.


Не могу ничего сказать ...

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 17 май 2009 14:49 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
Урааааа!!!! Я решил проблему :phones:
Нужно было так писать
Код:
for(int i=0;i<MAX;i++)
{         
           DiffuseSpecular(light[i].on,normalTex,eyeVec,lightvec[i],tan,norm,bin,tdif, tspec);
           diffuse += tdif;
           specular += tspec;   
}

а в самой DiffuseSpecular добавил:
Код:
void DiffuseSpecular(int on, vec3 nmap, vec3 ev, vec4 lv, vec3 tan, vec3 norm, vec3 bin, out vec3 diffuseOut, out vec3 specOut)
{
   diffuseOut=vec3(0);
   specOut=vec3(0);
   if(on!=1)  return; 
   ....
   код (*)
   ....
}

Мучился над этой проблемой 2 часа. С трудом нашел единственный вариант, когда код(*) не считается, а просто пропускается !!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 18 май 2009 08:51 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Н-да, прикольно!

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 19 май 2009 13:06 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
я вот нашел отличный исходник про шейдерные тени. Если кому надо то вот ссылка http://www.gamedev.ru/download/?id=8589


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 19 май 2009 13:15 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
а вот еще лучше урок http://www.google.com/codesearch/url?hl ... FYZNDPp1fw


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 19 май 2009 15:39 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Первый пример у меня не заработал.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 19 май 2009 16:57 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
у меня тоже не компилируется, но главное то код. Ну а второй исходник вообще зачетный. Пойду его изучать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 21 май 2009 08:56 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
MagicWolf, у меня еще вопрос: свои пост эффекты я сделал с помощью FBO. И все отлично работает. Но вот вчера обнаружил функцию glCopyTexSubImage2D. Что лучше использовать для рендеринга в текстуру, glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, pass_fbo[i]) или glCopyTexSubImage2D(...)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 21 май 2009 09:16 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Должно по идее glBindFramebufferEXT:
http://www.gamedev.ru/community/opengl/ ... fer_object

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: glsl
СообщениеДобавлено: 22 май 2009 11:31 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 04 июл 2008 10:11
Сообщения: 144
Откуда: Питер
значит я правильно всё делаю. Спасибо за статью ;)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB