Я пишу свой первый вершинный шейдер для (вот оно,) домашнего задания и не могу заставить его работать должным образом.
Мне нужно реализовать вершинный шейдер (и только вершинный шейдер), чем полностью имитировать вершинный шейдер конвейера фиксированной функции в 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 в конце.
В остальном все осталось по-прежнему. Я не могу сказать наверняка, почему это решило проблемы, поэтому, если кто-то знает, прокомментируйте с объяснением.