Шейдерные различия на iOS - PullRequest
8 голосов
/ 09 января 2012

Я изучаю 3D-программирование с книгой Изучаю современное программирование 3D-графики , но мне не везет с шейдерами и GLES 2.0 в iOS. Я работаю с игровым шаблоном xcode 4 opengl, но с изменениями, которые имеют смысл для первого примера в книге.

Первые шейдеры в книге не будут компилироваться с множеством разных ошибок. Первый вершинный шейдер

#version 330

layout(location = 0) in vec4 position;
void main()
{
    gl_Position = position;
}

Жалуется на оператор версии и отказывается использовать макет в качестве спецификатора. Мне наконец удалось получить это, чтобы построить.

attribute vec4 position;
void main()
{
    gl_Position = position;
}

Опять первый фрагментный шейдер отказывается от сборки из-за версии и не разрешает вывод в глобальный сегмент

#version 330
out vec4 outputColor;
void main()
{
   outputColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
}

С ошибкой

ERROR: 0:10: Invalid qualifiers 'out' in global variable context

Хорошо, мне удалось получить первый пример (простой треугольник) для работы со следующими шейдерами.

вершинный шейдер

#version 100
void main()
{
    gl_FragColor = vec4(1.0,1.0,1.0,1.0);
}

фрагментный шейдер

attribute vec4 position;
void main()
{
    gl_Position = position;
}

Так что это сработало, и я попробовал первый цветной пример в следующей главе.

#version 330
out vec4 outputColor;
void main() {
    float lerpValue = gl_FragCoord.y / 500.0f;
    outputColor = mix(vec4(1.0f, 1.0f, 1.0f, 1.0f),
        vec4(0.2f, 0.2f, 0.2f, 1.0f), lerpValue);
}

Даже обходя исправленные проблемы с ранее установленной версией, нельзя использовать версию f в плавающих числах. Шейдер по-прежнему отказывается строить с этой ошибкой

ERROR: 0:13: 'float' : declaration must include a precision qualifier for type

По сути, он жалуется на поплавок.

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

1 Ответ

14 голосов
/ 09 января 2012

добавьте это в верхнюю часть шейдера: precision mediump float;

или precision highp float;

зависит от ваших потребностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...