2012-03-14 3 views
0

Я пытаюсь изучить GLSL для Open GL ES 2.0. Я просмотрел учебники, но в объяснениях явно нет чего-то, потому что это не имеет никакого смысла. Возьмите код ниже. Это разорвано прямо с официальной карты OpenGL ES 2.0.Где данные, поступающие из этого вершинного шейдера?

Предполагается, что это шейдеры вершин.

uniform mat4 mvp_matrix; // model-view-projection matrix 
uniform mat3 normal_matrix; // normal matrix 
uniform vec3 ec_light_dir; // light direction in eye coords 
attribute vec4 a_vertex; // vertex position 
attribute vec3 a_normal; // vertex normal 
attribute vec2 a_texcoord; // texture coordinates 
varying float v_diffuse; 
varying vec2 v_texcoord; 

void main(void) 
{ 
    // put vertex normal into eye coords 
    vec3 ec_normal = normalize(normal_matrix * a_normal); 
    // emit diffuse scale factor, texcoord, and position 
    v_diffuse = max(dot(ec_light_dir, ec_normal), 0.0); 
    v_texcoord = a_texcoord; 
    gl_Position = mvp_matrix * a_vertex; 
} 

Задача 1: Ничто не инициализировано. В начале есть 8 переменных/объектов, и ни один из них не инициализируется. Итак, у нас есть 8 нулевых переменных/объектов.

Задача 2: Инициализированные переменные/объекты инициализируются с использованием предыдущих 8 нулевых переменных/объектов. Отлично, так что теперь все значение null ...

Задача 3: Ничто не исключено из функции. Как это может затенять что-то вне меня, оно ничего не принимает и ничего не пропускает. Единственное, что касается этого, может иметь эффект gl_Position, который, по-видимому, является какой-то специальной выходной переменной. Но это зависит только от mvp_matrix и a_vertex, для чего же все это?

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

+0

«Я посмотрел на учебники« Действительно? Какие? Да, весь код GLSL * выглядит так *, но есть и текст * вокруг кода, который объясняет, что означает «атрибут», «равномерность» и «переменный». Если такой текст не существует, то вы не найдете учебник. Вы нашли * пример кода *, который совсем другой. Учебники объясняют, примеры кода - это всего лишь код. –

ответ

3

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

// set up the position attribute 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices); 

выходы в затенении являются varyings v_diffuse и v_texcoord. значения для этих выходов интерполируются по всем визуализированным шейдерам фрагментов, для использования при освещении фрагментов.

переменная gl_Position - специальный выход, который устанавливает положение вершины.

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

+2

Не могли бы вы очистить грамматику на этом посту, пожалуйста? –

+0

какие биты вам не понравились? читает нормально. или вы имеете в виду мою патологическую неприязнь к прописным буквам? – Tark

+1

-1: Мне не нравится ваша патологическая неприязнь к прописным буквам. – Lordalcol