Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Квалификатор хранилища const





Также как и в “С”, const определяет, что переменные относятся к типу “только для чтения”. Например, заявление
const float Pi = 3.141529;

устанавливает переменную Pi в приближение к π. С добавлением модификатора const, приписка любых переменных после его заявки приводит к ошибке, пэтому они должны быть инициализированы при заявке.

 

Квалификатор хранилища in

Модификатор in служит для определения данных как данных ввода. Эти данным могут быть атрибутами вершин (для вершинного шейдера) или данными вывода с предыдущей стадии шейдинга.

Фрагментарный шейдер может дальше определить их значения ввода, если использовать некоторые ключевые слова, об этом в Главе 4, “Цвет, Пиксели и Кадровые буферы”.

 

Квалификатор хранилища out

Модификатор out используется для определения данных, как данных вывода со стадии шейдинга, например, преобразованные гомогенные координаты из вершинного шейдера, или конечный цветовой фрагмент их фрагментарного шейдера.

 

Квалификатор хранилища uniform

Этот модификатор определяет, что значение данной переменной будет указано приложением до применения шейдера и будет постоянным для всех обрабатываемых примитивов. Унифицированные переменные общие для всех стадий шейдинга в программе и должны быть заявлены как глобальные переменные. Любой тип переменных, в том числе, структуры и массивы, могут определяться как uniform. Шейдер не может прописать унифицированную переменную или изменить её значение.

Напрмер, вы хотите применить цвет для шейдинга примитива. Вы можете заявить переменную для передачи этой информации в ваши шейдеры. В шейдере вы делаете заявку:

uniform vec4 BaseColor;

Внутри шейдера, вы можете сноситься на BaseСolor по наименованию, но для установки его значения в вашем приложении, нужно проделать кое-что еще. Компилятор GLSL создает таблицу всех переменных uniform, когда привязывает к вашей программе. Чтобы установить значение BaseColor из приложения, вам нужно получить индекс BaseColor из таблицы, что делает вызовом glGetUniformLocation().

GLint glGetUniformLocation(GLuint program, const char* name);

Returns the index of the uniform variable name associated with the

shader program. name is a null-terminated character string with no spaces.

A value of minus one ( 1) is returned if name does not correspond to a

uniform variable in the active shader program, or if a reserved shader

variable name (those starting with gl_ prefix) is specified.

name can be a single variable name, an element of an array (by including

the appropriate index in brackets with the name), or a field of a structure

(by specifying name, then ‘‘.’’ followed by the field name, as you would in

the shader program). For arrays of uniform variables, the index of the

first element of the array may be queried either by specifying only the

array name (for example, ‘‘arrayName’’), or by specifying the index to the

first element of the array (as in ‘‘arrayName[0]’’).

The returned value will not change unless the shader program is relinked

(see glLinkProgram()).

 

Как только вы ассоциировали индекс с переменной uniform, вы можете задать значение переменной с помощью glUniform*() или glUniformMatrix*().

Пример 2.2 демонстрирует получение индекса уинифицированной переменной и установление значения.

Пример 2.2 Получение индекса переменной и установление значения

GLint timeLoc; /* Uniform index for variable "time" in shader */

GLfloat timeValue; /* Application time */

timeLoc = glGetUniformLocation(program, "time");

glUniform1f(timeLoc, timeValue);

void glUniform{1234}{fdi ui}(GLint location, TYPE value);

void glUniform{1234}{fdi ui}v(GLint location, GLsizei count,

const TYPE * values);

void glUniformMatrix{234}{fd}v(GLint location, GLsizei count,

GLboolean transpose,

const GLfloat * values);

void glUniformMatrix{2x3,2x4,3x2,3x4,4x2,4x3}{fd}v(

GLint location, GLsizei count,

GLboolean transpose,

const GLfloat * values);

Sets the value for the uniform variable associated with the index location.

The vector form loads count sets of values (from one to four values,

depending upon which glUniform*() call is used) into the uniform

variable’s starting location. If location is the start of an array, count

sequential elements of the array are loaded.

The GLfloat forms can be used to load the single-precision types of float, a

vector of floats, an array of floats, or an array of vectors of floats. Similarly

the GLdouble forms can be used for loading double-precision scalars,

vectors, and arrays. The GLfloat forms can also load Boolean types.

The GLint forms can be used to update a single signed integer, a signed

integer vector, an array of signed integers, or an array of signed integer

vectors. Additionally, individual and arrays of texture samplers and

Boolean scalars, vectors, and arrays can also be loaded. Similarly the

GLuint forms can be used for loading unsigned scalars, vectors, and

arrays.

For glUniformMatrix{234}*(), count sets of 2 × 2, 3 × 3, or 4 × 4

matrices are loaded from values.

For glUniformMatrix{2x3,2x4,3x2,3x4,4x2,4x3}*(), count sets of

like-dimensioned matrices are loaded from values. If transpose is

GL_TRUE, values are specified in row-major order (like arrays in ‘‘C’’); or if

GL_FALSE is specified, values are taken to be in column-major order.

 

Квалификатор хранилища buffer

Мы рекомендуем отправку больших буферв в приложение в виде переменной buffer. Они во многом похожи на uniform, только отличаются возможностью изменения шейдером. Обычно buffer-переменные используются в блоке buffer, о блоках в целом мы поговорим далее в этой главе.

Модификатор buffer определяет, что следующий блок является буфером памяти и общим для шейдера и приложения. Этот буфер может как читаться, так и переписываться шейдером. Размер буфера можно задать после компиляции шейдера и привязки программы.

 

Квалификатор хранилища shared

Модификатор shared использыется только при вычислении шейдера для установки памяти, общей для локальной группы. Подробнее об этом читайте в Главе 12, “Вычислительные шейдеры”.

 

Заявления

Настоящая работа шейдера заключается в вычислении значений и принятии решений. Как и на С++, GLSL имеет большой выбор операторов для создания арифметических операций для вычисления значений и стандартный набор логических структур для контроля над выполнением шейдера.

 

Арифметические операции

Ни один текст, описывающий язык не может считаться полным без обязательной таблицы операторов (см. Таблицу 2.6). Операторы перечислены в убывающем порядке предшествования. В целом, типы, которыми оперируют должны такими же, а для векторов и матриц операнды должны быть того же измерения. В таблице, интегральные типы включают int и uinit и их векторы, типы с плавающей запятой включают float и double, и их векторы и матрицы, arithmetic типы включают все интегральные и с плавающей запятой, а any дополнительно включают массивы и структуры.

 

Перегруженные операторы

Большинство операторов в GLSL - перегруженные, что означает, что они оперируют различными наборами данных. Точнее, арифметические операции (в том числе, пред- и пост-инкремента и -декремента) для векторов и матриц хорошо описаны в GLSL. Например, для умножения вектора и матрицы (помните, что последовательность операнд важна; умножение матриц некоммутативно, для вашего сведения), используйте следующию операцию:

vec3 v;

mat3 m;

vec3 result = v * m;

Все обычные ограничения работают и тут, а значит плановость матрицы и вертора должны совпадать. Также, умножение скаляров с вектором или матрицей даст предсказуемый результат. Одно исключение это то, что умножение двух векторов приведет к по-компонентному умножению компонентов. Однако, умножение двух матриц приведет к обычномы матричному умножению.

vec2 a, b, c;

mat2 m, u, v;

c = a * b; // c = (a.x*b.x, a.y*b.y)

m = u * v; // m = (u00*v00+u01*v10 u00*v01+u01*v11

// u01*v00+u11*v10 u10*v01+u11*v11)

Дополнительные операции с обычными векторами (напр., точечными и крестовыми) поддерживаются запросами функций, также как и разные пред-компонентные операции с векторами и матрицами.

 

Таблица 2.6 GLSL операторы и их предшествование







Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право...

ЧТО ПРОИСХОДИТ, КОГДА МЫ ССОРИМСЯ Не понимая различий, существующих между мужчинами и женщинами, очень легко довести дело до ссоры...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...

Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.