Blender для начинающих/Введение в GLSL



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

CTRL+ALT+U

CTRL+U

SHIFT+S

CTRL+Q

A

R

G

S

SHIFT+D

ALT+D

CTRL+NUMPAD+

CTRL+NUMPAD-

SHIFT+L

SHIFT+G

ALT+M

F

CTRL+ALT+SHIFT+C

SHIFT+S

D

T

I

Shift+B

B

C

Одни из главных классов Python: bpy.ops | bpy.data | bpy.types.ID

Рендеринг Рендер-ферма
Отсечение Шейдер
Трассировка лучей Сжатие текстур

Расположение элементов интерфейса


Ссылки на материалы
Возможно, Вас заинтересует следующее:
О Blender 2.76 Скачать Blender 2.76

Шейдеры

править

В GLSL есть несколько видов шейдеров.

  1. Вершинный шейдер предназначен для изменения координат вершин. Он проходит по всем вершинам, обрабатывая их данные, как и любой нижеуказанный шейдер.
  2. Фрагментный шейдер нужен для раскраски вершин.

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

attribute vec3 aVertexPosition;
void main(void) {
  gl_Position = vec4(aVertexPosition, 1.0);
}

Пример фрагментного шейдера:

void main(void) {
  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

Типы в GLSL

править
  1. void - функция, не возвращая никакого значения.
  2. bool - логические значения.
  3. int - целочисленные значения.
  4. float - числовые знаения с плавающей точкой.
  5. vec2 - двухмерный вектор, содержащий объект типа float.
  6. vec3 - трехмерный вектор, содержащий объект типа float.
  7. vec4 - четырехмерный вектор, содержащий объект типа float.
  8. ivec2, ivec3, ivec4 - векторы, содержащие объекты типа int.
  9. mat2, mat3, mat4 - матрицы размера 2х2 3х3 и 4х4 соответственно, содержащие объекты типа float.

Объявление любой переменной должно быть таким:

тип name;

Тип - тип переменной с именем name. Если нужно инициализировать переменную сразу при объявлении, то следует писать:

тип name = тип(значение)

Например, создание переменной типа vec2:

vec2 a = vec2(1.0, 2.0);

Для доступа к значениям векторов можно использовать конструкции вида:

vector[i]

 

Причем, i лежит от 0 до 3 (i € [0; 3]).

Также к их координатам можно обращаться так:

vector.x
vector.y
vector.z
vector.w

Квалификаторы

править

Квалификатор - модификатор, применяемый для изменения поведения переменной. В GLSL существуют такие квалификаторы:

  1. const - константа.
  2. attribute - глобальная переменная, которая может изменяться для каждой вершины.
  3. uniform - глобальная переменная, которая может изменяться для каждого полигона.
  4. varying используется для передачи интерполированных данных между вершинным и пиксельным шейдерами.
      Можно переприсваивать им значения в вершинном шейдере, но этого делать нельзя в пикселньном шейдере.

Условия

править

Условия в GLSL имеют такой синтаксис C:

if условие
{
  // блок операторов, выполняемых при истинности условия
}

Например:

if (3 > 0)
  printf("Три больше нуля");

Для сравнения в этом языке программирования присутствуют такие операторы:

Оператор Описание
== равно
!= не равно
> больше
>= больше или равно
< меньше
<= меньше или равно

Условие «если a больше или равно 3» будет выглядеть так:

if (a >= 3)
{
  // операторы
}

Когда же требуется выполнить некоторые команды при условии, которое не выполнилось, можно писать:

if условие
{
  // блок операторов, выполняемых при истинности условия
}
else
{
  // блок операторов, выполняемых при ложности условия
}

Например:

int a
a = 4
if a > 10
{
  a = 10
}
else
{
  a = 0
}

Множественный выбор

править

Множественный выбор организуется оператором else if.

 

if условие
{
  // блок операторов, выполняемых при истинности условия
}
else if условие
{
  // блок операторов, выполняемых при ложности предыдущего условия
}
...
else if условие
{
  // блок операторов, выполняемых при ложности предыдущего условия
}
else
{
  // блок операторов, выполняемых при ложности всех условий
}

Если условие в if ложно, то проверится следующее. Если и оно не выполнилось, то проверка перейдет к следующему условию. Так будет продолжаться до тех пор, пока программа не дойдет до else, операторы в котором выполняться, если ни одно из вышеуказанных условий не было верно. Если в некотором блоке, выше else, выполнились команды в {}, то проверка остальных условий не выполняется.

Цикл While предназначен для циклического выполнения операторов в {}, пока условие верно.

for ( /* инициализация переменной; условие; изменение значения переменной */ ) {
  // тело цикла (тут находится код, который будет повторяться)
}
  1. Инициализация переменной - объявление переменной в цикле.
  2. Условие - условие, проверяемое перед каждым выполнением (итерацией) цикла.
  3. Изменение переменной - то число, на которое будет изменяться переменная, после одной итерации цикла.

Увеличение координаты x вектора до тех пор, пока она меньше 10:

vec3 a = vec3(0,0,0)
int i = int(0)
for (i = 0; i<10; i+1) {
  a.x = i
}

Функции

править

Декларация функций (подпрограмм, возвращающих значение) выглядит так:

t Name(параметры)
{
    // операторы внутри функции
}

Здесь t - тип возвращаетого значения, Name - имя функции. Причем, если функция не возвращает значения, то вместо него пишется void, например:

void Mult(const in vec4 v1, const in int v2)
{
    // операторы внутри функции
}

Если функция должна иметь параметры, то они описываются следующим образом:

const convension имя_параметра
  1. const используется для того, чтобы изменить значение переменной было нельзя - она являлась константой.
  2. convension может быть одним из:
    1. in - создается локальная копия параметра.
    2. inout - передача параметра по ссылке (работа происходит с изначальной переменной, а не с ее копией).
    3. out - передача параметра по ссылке с запрещенным чтением.

Встроенные функции

править
Функция Описание
dot(x, y) возвращает скалярное произведение векторов x и y
cross(x, y) возвращает векторное произведение векторов x и y
normalize(x) возвращает нормализованный вектор x - вектор, у которого длина равна 1
sin(angle) возвращает синус угла angle
cos(angle) возвращает косинус угла angle
pow(x, y) возвращает x в степени y
min(x, y) возвращает минимальное из двух значений
max(x, y) возвращает максимальное из двух значений