attribute это входные массивы данных в вершинный шейдер.
т.е. это все вершины и все что с ними может быть связано.
причем если в шейдере несколько attribute,
например
attribute vec4 aPosition;
attribute vec2 aTextureCoord;
то если вершин будет 10, то и текстурных координат должно быть 10,
т.е. массивы в атрибутах должны быть всегда одинаковой длинны.
Сами данные по атрибутам передаются 2мя командами:
GLES20.glEnableVertexAttribArray(attributeHolderIndex)
GLES20.glVertexAttribPointer(attributeHolderIndex, сами данные сложенные в буфер)
Причем нужно понимать что сама шейдерная программа как бы будет работать для каждого атрибута из массива...
ну например передается 2 вершины: (1,0,0) и (1,1,1) - их передают в вершинный шейдер,
так вот программа вершинного шейдера выполниться 2 раза, один раз для первой вершины, второй раз для второй.
т.е. атрибуты каждый раз в каждом такте будут разными.
а uniformы - для каждого прохода шейдера будут одинаковыми...
т.е. униформы для всего отрисовываемого объекта будут одними, для всех вершин одни и теже значения.
передаются в шейдер они одной командой:
GLES20.glUniform1f(данные)...
в зависимости от типа команда будет незначительно отличаться:
GLES20.glUniform1f - предать 1 float
GLES20.glUniform1i - передать 1 int
GLES20.glUniform2f - передать 2 float
GLES20.glUniformMatrix4fv - передать матрицу 4*4
varying - это массивы данных которые передаются из вершинного шейдера во фрагментный.
(грубо можно их представить как тоже что и атрибуты, но если атрибуты из java в шейдер, то varying - это связь между шейдерами). varying в java никак не нужно описывать.
правда с varying есть еще одна штука, важная для понимания... если в вершинном шейдере varying на каждую вершину, то
во фрагментном уже будет varying для каждого пикселя.
Как это - например у нас есть 2 вершины пусть в вершине (a) var=1; а в вершине (b) var=2,
то во фрагментном шейдере мы увидим линейную интерполяцию для каждого пикселя который надо отрисовать.
т.е. для 11 пикселей - во фрагментном шейдере var={1 , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2 }
ну т.е. просто будет вот такое линейное размазывание (градиент) между значениями в вершинах.
кстати в новых версиях шейдеров
attribute переименовали в in
varying переименовали в out
если встретите in и out в примерах шейдеров не пугайтесь, для 2.0 просто переименовывайте и все будет работать.
вот как-то все так.
http://4pda.ru/forum/index.php?showtopi ... ry22114046