Blender для начинающих/Введение в GLSL: различия между версиями
Содержимое удалено Содержимое добавлено
Iniquity (обсуждение | вклад) м Откат правок Владислав Молдован (обс.) к версии Volobuev Ilya |
DannyS712 (обсуждение | вклад) м <source> -> <syntaxhighlight> (phab:T237267) |
||
Строка 5:
# Фрагментный шейдер нужен для раскраски вершин.
Вершинный шейдер:
<
attribute vec3 aVertexPosition;
void main(void) {
gl_Position = vec4(aVertexPosition, 1.0);
}
</syntaxhighlight>
Пример фрагментного шейдера:
<
void main(void) {
gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}
</syntaxhighlight>
=Типы в GLSL=
Строка 29:
#'''mat2''', '''mat3''', '''mat4''' - матрицы размера 2х2 3х3 и 4х4 соответственно, содержащие объекты типа float.
Объявление любой переменной должно быть таким:
<
Тип - тип переменной с именем name. Если нужно инициализировать переменную сразу при объявлении, то следует писать:
<
Например, создание переменной типа vec2:
<
Для доступа к значениям векторов можно использовать конструкции вида:
<
[[File:GLSL 1.jpg|frameless]]
Строка 41:
Также к их координатам можно обращаться так:
<
vector.y
vector.z
vector.w</
=Квалификаторы=
Строка 58:
=Условия=
Условия в GLSL имеют такой синтаксис C:
<
{
// блок операторов, выполняемых при истинности условия
}</
Например:
<
printf("Три больше нуля");</
Для сравнения в этом языке программирования присутствуют такие операторы:
{| class="wikitable sortable"
Строка 83:
|}
Условие «если a больше или равно 3» будет выглядеть так:
<
{
// операторы
}</
Когда же требуется выполнить некоторые команды при условии, которое не выполнилось, можно писать:
<
if условие
{
Строка 96:
{
// блок операторов, выполняемых при ложности условия
}</
Например:
<
int a
a = 4
Строка 108:
{
a = 0
}</
==Множественный выбор==
Множественный выбор организуется оператором else if.
Строка 114:
[[File:GLSL 2.jpg|frameless]]
<
if условие
{
Строка 132:
// блок операторов, выполняемых при ложности всех условий
}
</syntaxhighlight>
Если условие в if ложно, то проверится следующее. Если и оно не выполнилось, то проверка перейдет к следующему условию. Так будет продолжаться до тех пор, пока программа не дойдет до else, операторы в котором выполняться, если ни одно из вышеуказанных условий не было верно. Если в некотором блоке, выше else, выполнились команды в {}, то проверка остальных условий не выполняется.
Строка 139:
Цикл While предназначен для циклического выполнения операторов в {}, пока условие верно.
==For==
<
for ( /* инициализация переменной; условие; изменение значения переменной */ ) {
// тело цикла (тут находится код, который будет повторяться)
}
</syntaxhighlight>
# Инициализация переменной - объявление переменной в цикле.
# Условие - условие, проверяемое перед каждым выполнением (итерацией) цикла.
# Изменение переменной - то число, на которое будет изменяться переменная, после одной итерации цикла.
Увеличение координаты x вектора до тех пор, пока она меньше 10:
<
vec3 a = vec3(0,0,0)
int i = int(0)
Строка 154:
a.x = i
}
</syntaxhighlight>
=Функции=
Декларация функций (подпрограмм, возвращающих значение) выглядит так:
<
t Name(параметры)
{
// операторы внутри функции
}
</syntaxhighlight>
Здесь t - тип возвращаетого значения, Name - имя функции. Причем, если функция не возвращает значения, то вместо него пишется void, например:
<
void Mult(const in vec4 v1, const in int v2)
{
// операторы внутри функции
}
</syntaxhighlight>
Если функция должна иметь параметры, то они описываются следующим образом:
<
const convension имя_параметра
</syntaxhighlight>
#const используется для того, чтобы изменить значение переменной было нельзя - она являлась константой.
#convension может быть одним из:
|