Я пишу свой первый вершинный шейдер для (здесь) домашнего задания и не может заставить его функционировать должным образом.GLSL Vertex Shader вызывает либо мигающие цвета, либо все красные
Мне нужно реализовать вершинный шейдер (и только вершинный шейдер), чем полностью имитировать вершинный шейдер с фиксированной функцией в openGL и использовать шейдер фрагмента FFP (так что ничего не пишите для FS). Я знаю о встроенных равномерных переменных, и я использую их для вычисления конечного цвета вершины на основе уравнения освещения OpenGL. Я переименовал некоторые из значений ради читаемости (в нормальной и 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.
Edit: Ссылка на картину
http://i305.photobucket.com/albums/nn208/wolverine1190/shadercomp_zpsc546ac31.png
Всякий раз, когда я двигаю камеру, цвет на левом изменение. Возможно, это может указывать на неправильно рассчитанные нормальные или, возможно, на использование координат камеры где-то, чего я не должен был иметь?
================================================================================================================================== ===================
Решенный
Я исправил эту проблему. Не совсем точно, почему это работает сейчас, но это так. Я отменил все и переписал код с нуля тем же методом и расчетами. То, что я сделал по-другому:
1) Я установил значения с помощью конструкторов вместо простого назначения. Например, вместо vec3 test = someOtherVec3, я сделал vec3 test = vec3 (someOtherVec3).
2) При нормализации я присвоил нормализованный результат переменной себе, а не просто вызвал normalize(). Например, вместо нормализации (нормальный), нормальный = нормализовать (нормальный);
3) Я добавил к gl_FrontColor непосредственно на каждом шаге вместо хранения промежуточных значений в сумме и суммирования суммы в gl_FrontColor в конце.
Кроме этого, все оставалось неизменным. Я не могу точно сказать, почему это исправлено, поэтому, если кто-то знает, прокомментируйте это с объяснением.
Можете ли вы опубликовать фрагмент-шейдер? –
Нет фрагментарного шейдера, который я пишу. Используется шейдер с фиксированной функцией по умолчанию. – user2125891
Опубликовать снимок проблемы. Это может вызвать звонок для кого-то. –