Изменение кода шейдера в xcode в проекте iphone opengl es 2.0 приводит к ошибке

Я новичок в шейдерах, и я пытаюсь изучить основы. Но каждый раз, когда я меняю код в своем вершинном шейдере, это приводит к ошибке.

«Проверка не удалась: программа не была успешно связана».

Я использую стандартный проект openGL для iphone в качестве стартового в Xcode (с 2d-кубом, перемещающимся по оси y).

Изначально шейдер выглядит так:

attribute vec4 position;  
attribute vec4 color;  

varying vec4 colorVarying;  

void main()  
{  
     gl_Position = position;  
     gl_Position.y += sin(translate) / 2.0;  
     colorVarying = color;  
}  

и я хочу изменить его на:

uniform mat4 gl_ProjectionMatrix;  
uniform mat4 gl_ModelViewMatrix;  

attribute vec4 gl_Vertex;  

void main()  
{  
     gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;  
}  

Я все получаю, это белый экран и ошибка, упомянутая выше.

В чем проблема?

/Никлас


person tyuip    schedule 10.10.2010    source источник
comment
Вы пробовали очистить свой проект?   -  person Moshe    schedule 11.10.2010
comment
да, я попробовал это сейчас, но это все равно приводит к тому же результату ..   -  person tyuip    schedule 11.10.2010


Ответы (1)


Обратите внимание, что вы используете «изменяющийся» параметр. Это необходимо определить как для вершинного, так и для фрагментного шейдера. Поскольку вы, похоже, изменили только вершинный шейдер, я предполагаю, что это вызывает проблему с вашей ссылкой, поскольку colorVarying, вероятно, все еще находится в шейдере фрагментов. Попробуйте вернуть логику «colorVarying» в ваш вершинный шейдер. Что-то типа:

uniform mat4 gl_ProjectionMatrix;   
uniform mat4 gl_ModelViewMatrix;   

attribute vec4 gl_Vertex;   

attribute vec4 color;
varying vec4 colorVarying;

void main()   
{   
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;  
    colorVarying = color; 
}
person No one in particular    schedule 10.10.2010
comment
Тогда это работает. И, например, если я изменю gl_Position.y += sin(translate) / 2.0; в gl_Position.y += sin(translate)/4.0; мое поведение меняется. - person tyuip; 11.10.2010
comment
Прохладный. Теперь медленно меняйте по одной строке за раз, пока не столкнетесь с проблемой. Начните с добавления униформы, а затем атрибута. Затем измените вычисление gl_Position. Затем удалите строки, которые вам не нужны. Вы столкнетесь с проблемой где-нибудь. - person No one in particular; 12.10.2010
comment
Если я просто добавлю униформу mat4 gl_ProjectionMatrix; сломается.. =) - person tyuip; 12.10.2010
comment
Попробуйте изменить gl_ProjectionMatrix на myProjectionMatrix. - person No one in particular; 12.10.2010
comment
тогда это работает... но разве я не должен использовать глобальную gl_ProjectionMatrix? - person tyuip; 12.10.2010
comment
Хорошо. Я тупой. OpenGL объявляет для вас целую массу параметров, которые начинаются с gl_*. Их не нужно объявлять, просто используйте и устанавливайте. Попробуйте свой окончательный шейдер, но только с кодом main(). Попробуйте без объявлений над main(). - person No one in particular; 12.10.2010
comment
Если я сделаю только это: атрибут vec4 color; варьирующийся цвет vec4Varying; void main() { gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; цветРазличный = цвет; } Все равно не работает.. - person tyuip; 12.10.2010
comment
Странный. Сейчас я создал базовый проект. И я отредактировал вершинный шейдер следующим образом: void main() { gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; } и я вижу подпрыгивающий ящик. Это не должно работать, так как я не использую sin() для изменения позиции. Как будто помнит последний билд. - person No one in particular; 12.10.2010
comment
В порядке. Вышеуказанное по умолчанию использовало код OpenGL ES 1.x, поэтому я видел, как он работает. ... Теперь я вижу ту же проблему, что и вы. Что странно, так как это считается минимальным кодом вершинного шейдера. См.: lighthouse3d.com/opengl/glsl/index.php?minimal - person No one in particular; 12.10.2010
comment
Да, это был учебник, которому я следовал.. Я действительно не понимаю, что не так =) - person tyuip; 12.10.2010
comment
Тайна разгадана. Мы оба исследовали шейдеры для полной версии OpenGL. OpenGL ES 2.0 — гораздо более урезанная версия. Взгляните на сводку по языку khronos.org/opengles/sdk/2.0/docs/reference_cards/ (шейдеры внизу). Мы наблюдаем проблемы, поскольку в мобильной версии языка шейдеров OpenGL не определены многие термины gl_*, содержащиеся в настольной версии OpenGL. - person No one in particular; 12.10.2010