Еще вопрос:
Так же с посощью 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-буфера (видимо)...
