2015-02-24 3 views
0

Недавно я начал изучать opengl и до сих пор не очень-то знаю об этом. Я следовал учебник и написал эти два шейдеры:OpenGL Shader компилируется на рабочем столе, но не на Android

Vertex Shader:

#version 400 

in vec4 s_vPosition; 
in vec4 s_vColor; 
out vec4 color; 

void main() { 
    color = s_vColor; 
    gl_Position = s_vPosition; 
} 

Фрагмент Shader:

#version 400 

in vec4 color; 
out vec4 fColor; 

void main() { 
    fColor = color; 
} 

Они компилировать и работать нормально на рабочем столе с OpenGL 3, но Дон Компиляция с OpenGL ES 2 на Android. Я попытался проверить журнал вывода шейдера, но он вернул пустую строку. Опять же, я очень новичок в этом, и моя ошибка, вероятно, очень проста, но любая помощь будет высоко оценена.

+1

Нет, эти шейдеры не будут работать нормально с GL 3. Если они это сделают, то это будет осуществлено с помощью гениальной реализации. Эти шейдеры требуют GL 4.0 (хотя, по какой-то конкретной причине, они могли работать с 3.x, если была выбрана более разумная версия). Однако эти шейдеры в любом случае недействительны для ES2, который использует другой синтаксис (совместимый с GLSL 1.20), поэтому изменение версии там не поможет. – derhass

+0

Так что я могу сделать, чтобы это сработало? –

+0

Ничего, ответ Самгака не работает. –

ответ

4

В OpenGLES2 вы не используете префиксы переменнойи out, как в 3.0. Вместо того, чтобы использовать следующие ключевые слова:

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

attribute соответствует in в вершинном шейдере. A varying соответствует out в вершинном шейдере и in в фрагментном шейдере. Таким образом, изменить вершинный шейдер к этому:

attribute vec4 s_vPosition; 
attribute vec4 s_vColor; 
varying vec4 color; 

void main() { 
    color = s_vColor; 
    gl_Position = s_vPosition; 
} 

и ваш фрагмент шейдера к этому:

varying vec4 color; 

void main() { 
    gl_FragColor = color; 
} 

gl_FragColor это специально определено как переменная gl_Position используется для вывода цвета из фрагмента шейдер.

+0

Большое вам спасибо! Это сработало! Моя благодарность не может быть выражена словами. Теперь я могу продолжить и продолжить изучение openGL. –

Смежные вопросы