Сбой локальных переменных GLSL ES? - PullRequest
3 голосов
/ 03 октября 2011

Я пытаюсь реализовать некоторые шейдеры из онлайн-учебников (lighthouse3d.com) в моем движке OpenGL ES 2.0.

Проблема в том, что по какой-то причине ЛЮБЫЕ переменные, объявленные в области действия main (), вызывают сбой всего шейдера. например, это терпит неудачу:

void main(){
    vec4 color;     
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}

но это прекрасно работает:

void main(){
    //vec4 color;       
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}

То же самое происходит с моими вершинными шейдерами. ( EDIT : nvm, кажется, только с фрагментными шейдерами) Единственный способ использовать любой тип непостоянного значения - это использовать атрибуты, вариации, униформы и т.д., например, это работает так, как вы ожидаете:

uniform sampler2D texture;
varying lowp vec4 fragcol;
varying lowp vec2 texco;

void main(){
    gl_FragColor = fragcol * texture2D(texture, texco);
}

Кроме того, у меня чертовски много проблем, когда я пытаюсь найти документацию или ресурсы, конкретно касающиеся GLSL ES (или как называется эта версия). Все, что я смог найти, это: http://old.siggraph.org/publications/2006cn/course16/KhronosSpecs/ESLanguageSpec1.10.11.pdf

Это все, что я мог найти в связи с объявлениями переменных:

[snip] Типы по умолчанию отсутствуют. Все объявления переменных и функций должен иметь объявленный тип и, необязательно, квалификаторы. Переменная объявляется путем указания его типа, за которым следует одно или несколько имен через запятую. [snip]

И именно это я и сделал:

заявленный тип: vec4

, за которым следуют одно или несколько имен: color ;

vec4 color

Я не в курсе

EDIT: GLES20.glGetError () выдает ошибку 1282

1 Ответ

9 голосов
/ 03 октября 2011

GLSL ES отличается от традиционного GLSL тем, что для определения полного типа требуются прецизионные модификаторы. Вы пробовали, например ::

void main(){
    lowp vec4 color;     
    gl_FragColor = vec4(1.0, 0.5, 0.5, 1.0);
}

Вы также можете добавить что-то вроде этого в начало исходного файла:

precision highp float;

Чтобы установить точность по умолчанию, чтобы позже ее можно было опустить.

Чтобы получить подробную информацию об ошибке компиляции GLSL, вы можете использовать glGetProgramInfoLog (при помощи glGetProgramiv). Большинство реализаций GL возвращают значимую ошибку и номер строки. Я печально отстал от Java, но в C вы можете сделать:

    glCompileShader(shader);

    // check whether compilation was successful; if not
    // then dump the log to the console
    GLint status;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    if(!status)
    {
        GLint logLength;
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
        if (logLength > 0)
        {
            GLchar *log = (GLchar *)malloc(logLength);
            glGetShaderInfoLog(shader, logLength, &logLength, log);
            printf("Shader compile log:\n%s", log);
            free(log);
        }
    }
...