Откуда поступают данные в этом вершинном шейдере? - PullRequest
0 голосов
/ 15 марта 2012

Я пытаюсь изучить 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 нулевых переменных / объектов.Отлично, теперь все равно нулю ...

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

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

1 Ответ

3 голосов
/ 15 марта 2012

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

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

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

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

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

...