GLSL Vertex Shader вызывает либо мигание цветов, либо весь красный цвет.

Я пишу свой первый вершинный шейдер для (вот оно,) домашнего задания и не могу заставить его работать должным образом.

Мне нужно реализовать вершинный шейдер (и только вершинный шейдер), чем полностью имитировать вершинный шейдер конвейера фиксированной функции в openGL, и использовать шейдер фрагмента FFP (так что ничего не пишите для FS). Мне известны встроенные однородные переменные, и я использую их для вычисления окончательного цвета вершины на основе уравнения освещения openGL. Я переименовал некоторые значения для удобства чтения (normal и lightVec нормализованы):

    //given as part of the assignment, not modifable
    vec4 position = gl_ModelViewMatrix * gl_Vertex;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    //my (partial) code below here

    lightVec = (lightPos - position).xyz;
    distance = length(lightVec);
    vec3 normal = gl_NormalMatrix * gl_Normal;

    //I've stored a lot of the values in variables I defined locally
    //to make the code easier to read.
    //eg - constAtten = gl_LightSource[].constantAttenuation

    atten = 1/max((constAtten + distance*linearAtten + distance*distance*quadAtten),1); 
    ambient = ambInt * matAmbInt * atten;
    diffuse = difCol * matDifInt * max(dot(normal, lightVec),0.0) * atten;
    specular = specInt * matSpecInt * atten * pow(max(dot(normal, (gl_LightSource[i].halfVector).xyz),0.0), gl_FrontMaterial.shininess);

Я суммирую окружающий, диффузный и зеркальный для каждого источника света в сцене и сохраняю его как «сумма», за которым следует:

    gl_FrontColor = gl_FrontMaterial.emission + sum;
    gl_FrontColor.a = 1.0;

Результат - сумасшедшее мерцание цветов каждый раз, когда я перемещаю камеру сцены. Это openGL v1.2.

Изменить: ссылка на изображение

http://i305.photobucket.com/albums/nn208/wolverine1190/shadercomp_zpsc546ac31.png

Когда я перемещаю камеру, цвета слева меняются. Может ли это указывать на неверно вычисленную норму или, возможно, на использование координат камеры где-то, чего мне не следовало бы иметь?

=================================================================

Решено

Я исправил проблему. Не совсем уверен, почему это работает сейчас, но это так. Я все отбросил и переписал код с нуля с тем же подходом и расчетами. Я сделал иначе:

1) Я устанавливаю значения с помощью конструкторов, а не просто присваивания. Например, вместо vec3 test = someOtherVec3 я сделал vec3 test = vec3 (someOtherVec3).

2) При нормализации я присвоил себе нормализованный результат переменной вместо того, чтобы просто вызвать normalize (). Например - вместо normalize (нормальный), normal = normalize (нормальный);

3) Я добавил в gl_FrontColor непосредственно на каждом шаге, вместо того, чтобы хранить промежуточные значения в сумме и добавлять сумму в gl_FrontColor в конце.

В остальном все осталось по-прежнему. Я не могу сказать наверняка, почему это решило проблемы, поэтому, если кто-то знает, прокомментируйте с объяснением.


person user2125891    schedule 02.03.2013    source источник
comment
Можете выложить фрагментный шейдер?   -  person Brett Hale    schedule 02.03.2013
comment
Я не пишу фрагментного шейдера. По умолчанию используется фрагментный шейдер с фиксированной функцией.   -  person user2125891    schedule 02.03.2013
comment
Разместите изображение проблемы. Это может кому-то позвонить.   -  person Ben Jackson    schedule 02.03.2013


Ответы (1)


Из вашего описания мне интересно, не переполняются ли ваши цвета. Что произойдет, если вы попробуете:

    gl_FrontColor = clamp(gl_FrontMaterial.emission + sum, 0.0, 1.0);
person Ben Jackson    schedule 02.03.2013
comment
Никаких кубиков, результат тот же. В качестве примечания, я обновил свой окончательный расчет, чтобы включить глобальное окружение, так что теперь это gl_FrontColor = gl_FrontMaterial.emission + gl_LightModel.ambient*gl_FrontMaterial.ambient + sum;. Если я уберу сумму из уравнения, проблема исчезнет, ​​но ничего не горит должным образом. Все очень тускло. Я проверил длину суммы (чтобы проверить переполнение), и это совсем не очень большое значение, поэтому я не уверен, почему это вызывает проблемы. - person user2125891; 02.03.2013
comment
В любом случае я ошибаюсь: я проверил, и они неявно зажимаются OpenGL. - person Ben Jackson; 02.03.2013
comment
Итак, я обнаружил кое-что интересное. Пока значения в векторной сумме не равны нулю, у меня проблема. Неважно, насколько малы все значения, если они больше нуля, у меня мигают цвета. - person user2125891; 02.03.2013