Введение в GLSL

Содержание

Слайд 2

Обзор Материала

Введение в GLSL
Обзор структуры языка
Примеры шейдеров в GLSL

Обзор Материала Введение в GLSL Обзор структуры языка Примеры шейдеров в GLSL

Слайд 3

GLSL – Новый Стандарт для Программирования Шейдеров в OpenGL

Поддерживается драйверами с выпуском

GLSL – Новый Стандарт для Программирования Шейдеров в OpenGL Поддерживается драйверами с
OpenGL 1.5
Позволяет разработчикам использовать программируемые конвейеры с использованием OpenGL API
Язык программирования шейдеров высокого уровня
Стандартное расширение ARB

Слайд 4

Обзор Языка GLSL

Базируется на основе ANSI C
Сохранено большинство возможностей языка, за исключением

Обзор Языка GLSL Базируется на основе ANSI C Сохранено большинство возможностей языка,
тех случаев, когда страдает производительность
Добавлена поддержка векторов и матрих
Заимстованы некоторые возможности C++
Фунции, перегруженные по аргументам вызова (Overloaded functions)
Возможность декларирования переменных в любом месте по мере надобности

Слайд 5

Обзор Языка GLSL (продолж.)

GLSL является набором двух схожих языков для программирования VPU
Программирование

Обзор Языка GLSL (продолж.) GLSL является набором двух схожих языков для программирования
вершинного процессора
Программирование фрагментного процессора
Большая часть функциональных возможностей одинакова

Слайд 6

Обзор Вершинного Процессора

Конвейер, оперирующий вершинными данными
Используется для:
Трансформации вершин
Трансформации нормалей и их нормализации
Генерации

Обзор Вершинного Процессора Конвейер, оперирующий вершинными данными Используется для: Трансформации вершин Трансформации
текстурных координат
Рассчета освещения
Вершинные шейдеры – это программы, запускаемые на вершинном процессоре
Программа знает тольно об одной вершине

Слайд 7

Обзор Фрагментного Процессора

Конвейер, обрабатывающий интерполируемые данные для:
Наложения текстур
По-фрагментного рассчета цвета материала
Фрагментный

Обзор Фрагментного Процессора Конвейер, обрабатывающий интерполируемые данные для: Наложения текстур По-фрагментного рассчета
шейдер - это программа для фрагментного процессора, работающая с одним фрагментом
С помощью FS можно симулировать FFP полностью, но нельзя их использовать одновременно
Некоторые части FFP нельзя заменить с FS
Alpha and depth test
Scissor
Stencil test
Alpha blending
Знает текущее состояние конвейера OpenGL

Слайд 8

Функциональные Возможности Языка GLSL

Директивы препроцессора
Типы данных
Операторы и выражения
Структура языка
Встроенные переменные и типы

Функциональные Возможности Языка GLSL Директивы препроцессора Типы данных Операторы и выражения Структура
данных

Слайд 9

Директивы Препроцессора

#define
#undef
#if
#ifdef
#ifndef
#else
#elif
#endif
#error: Вывод диагностического сообщения
#pragma: Зависит от имплементации компилятора
#line: Вывод номера строки

Директивы Препроцессора #define #undef #if #ifdef #ifndef #else #elif #endif #error: Вывод
при запуске макро

Так же, как в C++

Слайд 10

Зарезервированные Слова в GLSL

attribute const uniform varying
break continue do for while
if else

Зарезервированные Слова в GLSL attribute const uniform varying break continue do for
in out inout
float int void bool true false
discard return
mat2 mat3 mat4
vec2 vec3 vec4 ivec2 ivec3 ivec4 bvec2 bvec3 bvec4
sampler1D sampler2D sampler3D samplerCube sampler1DShadow sampler2DShadow
struct

Слайд 11

Зарезервированные Слова в GLSL для Будущего Использования

Использование на данный момент вызывает ошибку:
asm
class

Зарезервированные Слова в GLSL для Будущего Использования Использование на данный момент вызывает
union enum typedef template
goto switch default
inline noinline volatile public
static extern external
long short double half fixed unsigned
input output
hvec2 hvec3 hvec4 dvec2 dvec3 dvec4 fvec2 fvec3 fvec4
sampler2DRect sampler3DRect
sizeof cast
namespace using

Слайд 12

Типы Данных в GLSL

void для функций без возвращаемого значения
bool булевское значение, true

Типы Данных в GLSL void для функций без возвращаемого значения bool булевское
или false
int целочисленное значение со знаком
float число с плавающей точкой
Многокомпонентные вектора в форме *vecN, где {*} – идентификатор типа данных (b для булевских векторов, i для целочисленных векторов и просто vecN для векторов с плавающей точкой) и N – это количество компонент.
vec2 – двух компонентный вектор с плавающей точкой
bvec4 – четырех компонентный булевский вектор
ivec3 – трех компонентный целочисленный вектор

Слайд 13

Матрицы и Чтение Текстур

Матрицы: только NxN матрицы с плавающей точкой (2x2: mat2,

Матрицы и Чтение Текстур Матрицы: только NxN матрицы с плавающей точкой (2x2:
3x3: mat3, 4x4: mat4)
Сэмплеры:
sampler1D
sampler2D
sampler3D
samplerCube
sampler1DShadow
sampler2DShadowэ

Слайд 14

Целочисленные Типы Данных

Поддержка в железе не обязательна: на данный момент не поддерживается

Целочисленные Типы Данных Поддержка в железе не обязательна: на данный момент не
существующим железом
Может использоваться для циклов и индексации массивов
Точность 16 битов + плюс бит знака
Переполнение 16ти битов создает несовместимость
Может быть переведены в данные с плавающей точкой для подсчетов
Контролируется драйверами
Константы могут быть заданы в десятичной, восьмеричной и шестнадцатеричной системе отсчета

Слайд 15

Вектора и Матричные Данные

2-, 3-, и 4-компонентные вектора
Матрицы могут быть только с

Вектора и Матричные Данные 2-, 3-, и 4-компонентные вектора Матрицы могут быть
плавающей точкой:
Адресуются в column major order
Например:
vec2 texcoord1, texcoord2;
vec3 position;
vec4 myRGBA;
ivec2 textureLookup;
mat4 viewMatrix;
Инициализация с помощью конструкторов

Слайд 16

Структуры Данных и Массивы

struct может быть использован для создания новых типов данных:
struct

Структуры Данных и Массивы struct может быть использован для создания новых типов
light
{
float intensity;
vec3 position;
} lightVar;
Однотипные переменные могут быть представлены массивом:
float myLights[8];
or
const int nNumLights = 2;
light lights[nNumLights];

Слайд 17

Обозначение Использования Переменных

< none: default >
Просто переменная
Const
Константа, либо параметр для фукции

Обозначение Использования Переменных Просто переменная Const Константа, либо параметр для фукции с
с неизменяемым значением
Attribute
Обозначает входные вершинные данные
Uniform
Неизменяемый внутри шейдера значение
Varying
Интеролируемые данные между вершинным и фрагментным шейдерами
In
Входные параметры функций
Out
Выводимые значения функций
Inout
«Входит-Выходит»
Глобальные переменные могут изпользовать обозначения “const, “attribute”, “uniform”, or “varying” – только один сразу
Локальные переменные могут использовать только “const”

Слайд 18

Обозначение Использования attribute

Для декларации переменной, как вершинных данных
Разрешено только в вершинном шейдере

Обозначение Использования attribute Для декларации переменной, как вершинных данных Разрешено только в
для чтения
Данные передаются в вершинный шейдер через vertex API либо как часть вершинного массива данных в OpenGL
Нельзя использовать как структуры данных либо как массивы: только как float, vec2, vec3, vec4, mat2, mat3, или mat4
attribute vec4 position;
attribute vec3 normal;
attribute vec2 texCoord;
Максимальное количество вершинных аттрибутов – 16

Слайд 19

Стандартные Вершинные Атрибуты в OpenGL

attribute vec4 gl_Color;
attribute vec4 gl_SecondaryColor;
attribute vec3 gl_Normal;
attribute vec4

Стандартные Вершинные Атрибуты в OpenGL attribute vec4 gl_Color; attribute vec4 gl_SecondaryColor; attribute
gl_Vertex;
attribute vec4 gl_MultiTexCoord0;
attribute vec4 gl_MultiTexCoord1;
attribute vec4 gl_MultiTexCoord2;
attribute vec4 gl_MultiTexCoord3;
attribute vec4 gl_MultiTexCoord4;
attribute vec4 gl_MultiTexCoord5;
attribute vec4 gl_MultiTexCoord6;
attribute vec4 gl_MultiTexCoord7;
attribute float gl_FogCoord;

Слайд 20

Обозначение Использования uniform

Неизменяемые внутри шейдера значения для чтения
Заданные непосредственно программой через команды

Обозначение Использования uniform Неизменяемые внутри шейдера значения для чтения Заданные непосредственно программой
API либо через OpenGL state:
Например все переменные в RenderMonkey заданы как uniform параметры для шейдеров
uniform vec4 lightPosition;
Может быть использованы с любыми типами данных
Конкретная имплементация OpenGL драйвера задает максимальное количество доступных uniform параметров
Внимание: Заметьте, что в OpenGL uniforms задаются в объекте шейдерной программы, а не в самих шейдерах

Слайд 21

Обозначение Использования varying

Интерполируемые данные между вершинным и фрагментным шейдером
Вершинный шейдер просчитывает значение

Обозначение Использования varying Интерполируемые данные между вершинным и фрагментным шейдером Вершинный шейдер
этих переменных на каждую вершину и передает из в фрагментный шейдер через интерполяторы
Переменные varying интерполируются как perspective-correct значение
Фрагментный шейдер может читать varying значения
Декларации должны совпадать в вершинном и фрагментном шейдерах
varying vec3 normal;
Можно использовать только float, vec2, vec3, vec4, mat2, mat3, и mat4, либо массивы из этих типов данных.

Слайд 22

Переменные Вывода из Вершинного Шейдера

vec4 gl_Position: homogenous позиция вершины – вывод обязателен
float

Переменные Вывода из Вершинного Шейдера vec4 gl_Position: homogenous позиция вершины – вывод
gl_PointSize: вершинный шейдер может вывести размер рисуемой точки в пикселях
vec4 gl_ClipVertex: вершинный шейдер может выверсти координаты для использования с user clipping planes.

Слайд 23

Переменные Вывода из Фрагментного Шейдера

vec4 gl_FragColor
Цвет фрагмента, вывод обязателен
float gl_FragDepth
Значение глубины сцены

Переменные Вывода из Фрагментного Шейдера vec4 gl_FragColor Цвет фрагмента, вывод обязателен float gl_FragDepth Значение глубины сцены

Слайд 24

Конструкторы

int(bool) – из Boolean в int
int(float) – из float в int
float(bool) -

Конструкторы int(bool) – из Boolean в int int(float) – из float в
из Boolean в float
vec3(float) - initializes each component of a vec3 with the float
vec4(ivec4) - makes a vec4 from an ivec4, with component-wise conversion
vec2(float, float) - initializes a vec2 with 2 floats
ivec3(int, int, int) - initializes an ivec3 with 3 ints
bvec4(int, int, float, float) - initializes with 4 Boolean conversions
vec2(vec3) - drops the third component of a vec3
vec3(vec4) - drops the fourth component of a vec4
vec3(vec2, float) - vec3.x = vec2.x, vec3.y = vec2.y, vec3.z = float

Слайд 25

Доступ к Компонентам

Поддерживаемые компоненты векторов:
{x, y, z, w} - изпользуются при считывании

Доступ к Компонентам Поддерживаемые компоненты векторов: {x, y, z, w} - изпользуются
позиций или нормаль
{r, g, b, a} - используются при считывание цветов
{s, t, p, q} – используются при считывании текстурных координат
vec4 v4;
v4.rgba; - четырех компонентный вектор
v4.rgb; - трех компонентный вектор
v4.b; - знание с плавающей точкой
v4.xgba; - нелегально – нельзя мешать компоненты из разных наборов!
Порядок компонент может быть различным для swizzle либо повторен (replicated):
vec4 pos = vec4(1.0, 2.0, 3.0, 4.0);
vec4 swiz = pos.wzyx; - swiz = (4.0, 3.0, 2.0, 1.0)
vec4 dup = pos.xxyy; - dup = (1.0, 1.0, 2.0, 2.0)
Компоненты матриц могут быть считаны изпользуя [] []
mat4 myMatrix;
myMatrix[0][2] = 4.0;

Слайд 26

Вход в Шейдер

Изпользуется функция main
Она должна быть объявлена таким образом:
void main(void)
{
...
}

Вход в Шейдер Изпользуется функция main Она должна быть объявлена таким образом:

Слайд 27

Flow Control Semantics

If / else поддерживается
if ( bool_expression)
True expression
else
False expression
Также поддерживаются циклы
for

Flow Control Semantics If / else поддерживается if ( bool_expression) True expression
(init-expression; condition-expression; loop-expression)
sub-statement
while (condition-expression)
sub-statement
do
statement
while (condition-expression)

Слайд 28

Jump Statements

continue;
break;
return и return expression
discard
Только используется, когда нужно прекратить подсчет данных для

Jump Statements continue; break; return и return expression discard Только используется, когда
фрагмента
Фрагмент выброшен и данные буфера кадра не изменяются
Например: Можно тестировать значение alpha для фрагмента и выбрасывать фрагмент на основе этого теста

Только в циклах

Слайд 29

Встроенные OpenGL Константы

Можно использовать в вершинном и фрагментном шейдере
const int gl_MaxLights =

Встроенные OpenGL Константы Можно использовать в вершинном и фрагментном шейдере const int
8; - GL 1.0
const int gl_MaxClipPlanes = 6; - GL 1.0
const int gl_MaxTextureUnits = 2; - GL 1.2
const int gl_MaxTextureCoordsARB = 2; - ARB_fragment_program
const int gl_MaxVertexAttributesGL2 = 16; - GL2_vertex_shader
const int gl_MaxVertexUniformFloatsGL2 = 512; - GL2_vertex_shader
const int gl_MaxVaryingFloatsGL2 = 32; - GL2_vertex_shader
const int gl_MaxVertexTextureUnitsGL2 = 1; - GL2_vertex_shader
const int gl_MaxFragmentTextureUnitsGL2 = 2; - GL2_fragment_shader
const int gl_MaxFragmentUniformFloatsGL2 = 64; - GL2_fragment_shader

Слайд 30

Встроенное Состояние OpenGL

Программа может задать OpenGL state, который может быть считан внутри

Встроенное Состояние OpenGL Программа может задать OpenGL state, который может быть считан
шейдеров используя встроенные переменные
uniform mat4 gl_ModelViewMatrix;
uniform mat4 gl_ProjectionMatrix;
uniform mat4 gl_ModelViewProjectionMatrix;
uniform mat3 gl_NormalMatrix; // derived
uniform mat4 gl_TextureMatrix[gl_MaxTextureCoordsARB];
uniform float gl_NormalScale; …
А так же константы для параметров глубины сцены, цвета материалов, параметры задачи освещения, clip plane parameters, point parameters (size, etc), текстурных параметров, тумана, и т.д.
Имя файла: Введение-в-GLSL.pptx
Количество просмотров: 87
Количество скачиваний: 0