ПрограммированиеСтатьиГрафика

Введение в GLSL. (2 стр)

Автор:

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

В GLSL vs умеет читать из текстуры (но при этом для mipmap-текстур нужно вручную указывать mip-уровень). Также, для программ, комбинирующих ffp- и pp-проходы, можно использовать функцию ftransform(), которая трансформирует позицию из object space в clip space точно так же, как и ffp;

Ограничения:

GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB - кол-во uniform'ов в vs;
GL_MAX_VARYING_FLOATS_ARB - кол-во varying-переменных в vs/fs;
GL_MAX_VERTEX_ATTRIBS_ARB - кол-во атрибутов в vs;
GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB - кол-во tiu, которое может использовать vs;
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB  - кол-во tiu, которое могут использовать vs и fs в сумме (если реализизация  tiu между vs/fs);
GL_MAX_TEXTURE_COORDS_ARB - кол-во tc, которое может использовать vs/fs;

Наш vs будет колебать позицию по синусу, угол будет задаваться uniform'ом из внешней программы; и передавать fs в varying-переменной угол, приведенный к [0..1].

  struct u_Struct            // Объявляем структуру.
  {
    float angle;             // В мембере angle будет храниться угол (0..2*Pi), значение которого
                             // будем задавать в программе.
  };

  uniform u_Struct u_struct; // Объявляем uniform-переменную u_struct.

  varying float v_t;         // Объявляем varying-переменную v_t. Эта переменная будет передаваться 
                             // во фрагментный шейдер, где мы будем читать ее интерполированное
                             // значение.

  attribute float a_phase;   // Объявляем attribute-переменную a_phase. Эта переменная будет
                             // задаваться повершинно, и означать фазовое смещение для синуса.

  void main(void)            // Главная функция - точка входа в шейдер. 
  {
    float c = sin(a_phase + u_struct.angle);     // Занесем в переменную 'c' вычисленный синус 
                                                 // с данной фазой и углом.

    gl_Position = gl_ModelViewProjectionMatrix * // Запишем в clip-позицию вершина
                  gl_Vertex +                    // трансформированные object-позицию и добавим
                  c;                             // к полученному вектору значение 'c'.
                                                 // Каждая вершина будет колебаться по синусу
                                                 // со своей фазой и общим углом.         

    v_t = abs(sin(u_struct.angle));              // Вычислим 0..1 значение, зависящее от угла.
                                                 // Полученное число мы запишем в 
                                                 // varying-переменную 'v_t'  для последующего 
                                                 // использования во фрагментом шейдере.

    // Выполняем работу ffp:

    gl_FrontColor = gl_Color;                    // Пишем цвет.
    gl_TexCoord[0] = gl_MultiTexCoord0;          // Пишем 0-ой tc.
  }
Страницы: 1 2 3 4 Следующая »

#GLSL, #шейдеры

2 января 2004 (Обновление: 17 июня 2010)

Комментарии [39]