Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Множественные источники света 
V
    Опции темы
Coridas
Дата 2.12.2006, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.7.2006

Репутация: нет
Всего: нет



Добрый день, попытался создать шейдер для двух направленных источников света (использовал RenderMonkey), вот код:

float4x4 matViewProjection;
float4 lightDir1;
float4 lightDir2;

struct VS_INPUT 
{
   float4 Position : POSITION0;
   float3 normal:NORMAL0;
};

struct VS_OUTPUT 
{
   float4 Position : POSITION0;
   float3 normal:TEXCOORD0;
   float4 dir1:TEXCOORD1;
   float4 dir2:TEXCOORD2;
};

VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;

   Output.Position = mul( matViewProjection, Input.Position );
   Output.normal=Input.normal;
   Output.dir1=lightDir1;
   Output.dir2=lightDir2;
   return( Output );
   
}


float4 ambientColor;
float ambientPower;
float4 diffuseColor1;
float4 diffuseColor2;
float diffusePower1;
float diffusePower2;

float4 ps_main(float3 normal:TEXCOORD0,float4 dir1:TEXCOORD1,float4 dir2:TEXCOORD2) : COLOR0
{   
   return ambientPower*ambientColor+diffusePower1*diffuseColor1*dot(normalize(normal),normalize(dir1))+
          diffusePower2*diffuseColor2*dot(normalize(normal),normalize(dir2));
   
}

Но че-то не так, направления источников взаимно перпендикулярны:
1-й источник:
user posted image
Потом 2-й источник:
user posted image
Все вроде бы хорошо, но вот финальный результат, который в принципе таким не должен быть:
user posted image

Посмотрите, может че в шейдере напортачил, или совсем не то делаю....


PM MAIL   Вверх
Bitter
Дата 2.12.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



Я не очень разбераюсь в шейдерах, но заметил, что ты используешь формулу

Id * Pd * (sm / |s||m|), где I - интенсивность освещения, Pd - собственно коэфициент диффузной составляющей,  (sm / |s||m|) - косинус угла между векторами, ОДНАКО есть более правильная формула:

Id * Pd * max(sm / |s||m| , 0). Дело в том, что если микрогрань направлена в сторону ОТ глаза, то скалярное произведение отрицательно и в этом случае результат должен быть равен 0. Но всё это только для диффузной составляющей. Полная же формула выглядит так:

Color = Ia*Pa + Id*Pd * lambert + Is*Ps * phong^f,      (^f  -  в степени f)

где lambert - max( 0, sm/|s||m| )
      phong - max ( 0, hm/|h||m|), 
      f - подбирается эксперементально и обычно в пределах 1..200
      Ia*Pa -                   ambient
      Id*Pd * lambert -   diffuse
      Is*Ps * phong^f -  specular
где h=s+v;

Ух... где:

m - нормаль микрограни
s - вектор от микрограни к источнику света
v - вектор от микрограни к камере

PM MAIL ICQ Skype   Вверх
Vel
Дата 16.12.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



2 coridas

Буду проще Bittera...

Для понимания немногоsmile упростим твой код
dot(normalize(normal),normalize(dir1))+dot(normalize(normal),normalize(dir2));

Попробуй так
max(0,dot(normalize(normal),normalize(dir1)))+max(0,dot(normalize(normal),normalize(dir2)));





PM MAIL   Вверх
Bitter
Дата 16.12.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 5
Всего: 27



Цитата

Буду проще Bittera...


да уж... теория всегда сложна smile
PM MAIL ICQ Skype   Вверх
Vel
Дата 17.12.2006, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 20.8.2006

Репутация: нет
Всего: нет



to Bitter

Каков вопрос таков ответ,я так думаю...
Хотя конечно ёсли смотреть на даный вопрос болеё обширно, так можно начать 
с уравнения нахождения середины триугольника, а закончить где-то в области теории света... 
PM MAIL   Вверх
Coridas
Дата 25.12.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.7.2006

Репутация: нет
Всего: нет



На самом деле все было очень просто, и как всегда виновата невнимательность, и недосыпание smile))
return ambientPower*ambientColor+diffusePower1*diffuseColor1*saturate(dot(normalize(normal),normalize(dir1)))+
          diffusePower2*diffuseColor2*saturate(dot(normalize(normal),normalize(dir2)));

всем спасибо smile

PM MAIL   Вверх
arilou
Дата 26.12.2006, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Вот и хорошо, а то флейм пошел.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.