PMG
http://forum.pmg.org.ru/

Помогите разобраться с GL_ARB_shader_objects
http://forum.pmg.org.ru/viewtopic.php?f=1&t=756
Страница 1 из 1

Автор:  Виталий Лещенко [ 21 сен 2006 20:27 ]
Заголовок сообщения:  Помогите разобраться с GL_ARB_shader_objects

Hi, All!

Subj!

Мне нужно реализовать относительно простой эфект... освещение от направленного источника.
Значит есть у меня сфера (рисуется квадриком) и вектор "света" - LightVec

Делаю так:
Код:
// vertex shader
uniform vec4 LightVec;
varying vec2 uv;
varying vec4 color;
 
void main()
{
  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

  vec4 n = normalize(vec4(gl_Normal, 1));
  vec4 normalVec = gl_ModelViewProjectionMatrix * n;

  vec4 lightVec = normalize(LightVec);

  float diffuse = max(dot(normalVec, lightVec), 0.2);
       
        color.a = 1;
        color.rgb = vec3(diffuse, diffuse, diffuse);

  uv = gl_MultiTexCoord0.xy;
}

Код:
// fragment shader
uniform sampler2D diffuseMap;
varying vec2 uv;
varying vec4 color;

void main()
{
  vec4 res = color * texture2D(diffuseMap, uv);
  gl_FragColor = res;
}


Получаю сферу... но вот цвета не те...
Что я делаю не так?
Как надо?

Автор:  Виталий Лещенко [ 21 сен 2006 23:47 ]
Заголовок сообщения: 

Спасибо... с этим вопрособ я уже сам разобрался...

Автор:  Виталий Лещенко [ 21 сен 2006 23:49 ]
Заголовок сообщения: 

Еще вопрос:
Так же с посощью GL_ARB_shader_objects делаю освещение из точесных источников.
Тут только фрагментный шейдер:
Код:
// fragment shader
uniform float rrad;
void main()
{
  vec3 lightdist = gl_TexCoord[0].xyz;
  float t = dot(lightdist, lightdist);
  float light = 1.0 - rrad * sqrt(t);
  gl_FragColor = vec4(light, light, light, 1);
}

// end
Тут rrad = 1 / omni.radius
lightdist = вектор от точки до источника

Метод освещения такой:
1.
glBlendFunc(GL_ONE, GL_ZERO);
glDisable(GL_TEXTURE_2D);
glColor3f(0.2, 0.2, 0.2);
2.
Рисую черым цветом всю сцену

3.
glDepthFunc(GL_EQUAL);
glDepthMask(GL_FALSE);
glBlendFunc(GL_ONE, GL_ONE);
4.
Включаю шейдер

5. Перерисовываю все сектора, которые "косаются" лампочек
6. Выключаю шейдер
7.
glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
glColor3f(1,1,1);

8. Перерисовываю всю сцену с текстурами

Получаю искомый результат... НО!
Иногда 8 этап не попадает на те же места где был написован во 2 и 5 этапе... и лезут артефакты.

Вопрос:
Где именно происходит нарушение в точности расчета?...
Как это побороть?
Какие есть другие способы решения изначальной проблемы (реализовать освещение omni) используя GL_ARB_shader_objects?

Это момент когда все нормально...
Изображение
А сейчас проблемы из-за неточности z-буфера (видимо)...
Изображение

Автор:  MagicWolf [ 22 сен 2006 17:02 ]
Заголовок сообщения: 

Это сложно попасть два раза в одно и тоже место, это видяхи зависит данная прецезионность.

Автор:  Виталий Лещенко [ 22 сен 2006 17:21 ]
Заголовок сообщения: 

До этого я сделал реализацию через RC
Отличия били лишь в том, что эти светлые пятна писовалить по другому... остальные этапы идентичны.
Раньше все работало... что здесь не так?

Автор:  MagicWolf [ 25 сен 2006 14:27 ]
Заголовок сообщения: 

Что тут не так я тоже собразить не могу сходу. Могу только шейдерам по рекомендовать обратиться к Борескову. Но возможно подойдет и подход с исключениями, т.е. возвращаешься к тому что было, а потом поэтапно переходишь к тому что надо...

Автор:  Виталий Лещенко [ 25 сен 2006 23:10 ]
Заголовок сообщения: 

Извиняюсь... был не прав!
Ошибку уже нашел... и исправил.
Дела в том, что из-за своей невнимательности я забыл включить текстуры...
почему в некоторых кадрах текстуры били? Я не знаю... это точно глюк...

А общем я сам был виноват...

Автор:  MagicWolf [ 26 сен 2006 08:34 ]
Заголовок сообщения: 

Бывает

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/