Blender для начинающих/Введение в GLSL: различия между версиями

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