Blender для начинающих/Введение в GLSL
Содержание コンテンツ
Blender 2.77 - теория 이론
Blender 2.77 - практика 实践
Blender 2.49 - теория 이론
Старый Blender Содержит информацию о Blender 2.49. После прочтения данной части книги Вы сможете назвать основные плюсы и минусы Blender 2.49. Blender 2.77 & 3DsMax 이론
Blender & 3DsMax Сравнение Blender, 3DsMax, Sweet Home и Art Of Illusion. После прочтения этой главы Вы будете немного знать о различиях этих программ. Программирование 이론
Дополнительное 이론
Постобработка изображений
Музыкальное сопровождение
Одни из главных классов Python: bpy.ops | bpy.data | bpy.types.ID
|
Ссылки на материалы |
---|
|
Возможно, Вас заинтересует следующее: |
О Blender 2.76 | Скачать Blender 2.76 |
Шейдеры
[править]В GLSL есть несколько видов шейдеров.
- Вершинный шейдер предназначен для изменения координат вершин. Он проходит по всем вершинам, обрабатывая их данные, как и любой нижеуказанный шейдер.
- Фрагментный шейдер нужен для раскраски вершин.
Вершинный шейдер:
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
[править]- void - функция, не возвращая никакого значения.
- bool - логические значения.
- int - целочисленные значения.
- float - числовые знаения с плавающей точкой.
- vec2 - двухмерный вектор, содержащий объект типа float.
- vec3 - трехмерный вектор, содержащий объект типа float.
- vec4 - четырехмерный вектор, содержащий объект типа float.
- ivec2, ivec3, ivec4 - векторы, содержащие объекты типа int.
- 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 существуют такие квалификаторы:
- const - константа.
- attribute - глобальная переменная, которая может изменяться для каждой вершины.
- uniform - глобальная переменная, которая может изменяться для каждого полигона.
- 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
[править]Цикл While предназначен для циклического выполнения операторов в {}, пока условие верно.
For
[править]for ( /* инициализация переменной; условие; изменение значения переменной */ ) {
// тело цикла (тут находится код, который будет повторяться)
}
- Инициализация переменной - объявление переменной в цикле.
- Условие - условие, проверяемое перед каждым выполнением (итерацией) цикла.
- Изменение переменной - то число, на которое будет изменяться переменная, после одной итерации цикла.
Увеличение координаты 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 имя_параметра
- const используется для того, чтобы изменить значение переменной было нельзя - она являлась константой.
- convension может быть одним из:
- in - создается локальная копия параметра.
- inout - передача параметра по ссылке (работа происходит с изначальной переменной, а не с ее копией).
- 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) | возвращает максимальное из двух значений |