2013-03-02 2 views
0

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

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

+0

Можете ли вы опубликовать фрагмент-шейдер? –

+0

Нет фрагментарного шейдера, который я пишу. Используется шейдер с фиксированной функцией по умолчанию. – user2125891

+0

Опубликовать снимок проблемы. Это может вызвать звонок для кого-то. –

ответ

0

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

gl_FrontColor = clamp(gl_FrontMaterial.emission + sum, 0.0, 1.0); 
+0

Нет кубиков, все тот же результат. В качестве дополнительной заметки я обновил свой окончательный расчет, включив глобальную среду, так что теперь это 'gl_FrontColor = gl_FrontMaterial.emission + gl_LightModel.ambient * gl_FrontMaterial.ambient + sum; ' Если я удалю сумму из уравнения, проблема исчезнет, ​​но ничего не загорится должным образом. Все очень тускло. Я проверил длину суммы (чтобы проверить переполнение), и это не очень большое значение, поэтому я не уверен, почему это вызывает проблемы. – user2125891

+0

Я все равно ошибаюсь: я проверил, и они неявно закрыты OpenGL. –

+0

Итак, я обнаружил что-то интересное. Пока значения в векторной «сумме» не равны нулю, у меня есть проблема. Неважно, насколько малы все значения, если они больше нуля, у меня есть мигающие цвета. – user2125891