ПОЗНАВАТЕЛЬНОЕ Сила воли ведет к действию, а позитивные действия формируют позитивное отношение Как определить диапазон голоса - ваш вокал
Игровые автоматы с быстрым выводом Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими Целительная привычка Как самому избавиться от обидчивости Противоречивые взгляды на качества, присущие мужчинам Тренинг уверенности в себе Вкуснейший "Салат из свеклы с чесноком" Натюрморт и его изобразительные возможности Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д. Как научиться брать на себя ответственность Зачем нужны границы в отношениях с детьми? Световозвращающие элементы на детской одежде Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия Как слышать голос Бога Классификация ожирения по ИМТ (ВОЗ) Глава 3. Завет мужчины с женщиной 
Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д. Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу. Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар. | Инициализаторы и конструкторы Введение в glsl Что такое шейдеры Шейдеры – это компонент шейдерной программы, мини-программа, которая выполняется в рамках отдельного этапа в общем конвейере OpenGL, выполняются непосредственно на GPU и действуют параллельно. Шейдерные программы предназначены для замены части архитектуры OpenGL, которую называют конвейером с фиксированной функциональностью. С версии OpenGL 3.1 фиксированная функциональность была удалена и шейдеры стали обязательными. Шейдер — специальная подпрограмма, выполняемая на GPU. Шейдеры для OpenGL пишутся на специализированном C-подобном языке — GLSL. Они компилируются самим OpenGL перед использованием. Шейдерная программа объединяет набор шейдеров. В простейшем случае шейдерная программа состоит из двух шейдеров: вершинного и фрагментного. Вершинный шейдер вызывается для каждой вершины. Его выходные данные интерполируются и поступают на вход фрагментного шейдера. Обычно, работа вершинного шейдера состоит в том, чтобы перевести координаты вершин из пространства сцены в пространство экрана и выполнить вспомогательные расчёты для фрагментного шейдера. Фрагментный шейдер вызывается для каждого графического фрагмента (пикселя растеризованной геометрии, попадающего на экран). Выходом фрагментного шейдера, как правило, является цвет фрагмента, идущий в буфер цвета. На фрагментный шейдер обычно ложится основная часть расчёта освещения. Виды шейдеров: вершинный, тесселяции, геометрический, фрагментный. Tessellation Control Shader | Tessellation Evaluation Shader | Графический конвейер 4.3 GLSL (OpenGL Shading Language) Язык высокого уровня для программирования шейдеров. Номер версии GLSL соответствует версии OpenGL. GLSL был спроектирован для совместного использования с OpenGL. GLSL имеет встроенные возможности доступа к состоянию OpenGL. Открытый межплатформенный стандарт. Нет других шейдерных языков, являющихся частью межплатформенного стандарта. GLSL может быть реализован разными производителями на произвольных платформах. Компиляция исходного кода во время выполнения. Отсутствие дополнительных библиотек и программ. Все необходимое – язык шейдеров, компилятор и компоновщик – определены как часть OpenGL. Типы данных GLSL. Объявление переменных Переменные GLSL такие же, как в C++ : могут быть объявлены по необходимости и имеют ту же область видимости: float f; f = 3.0; vec4 u, v; for (int i = 0; i < 10; ++i) v = f * u + v; void | для функций, которые не возвращают значение | bool | два значения true или false | Скалярные типы данных int | знаковое целое | uint | беззнаковое целое | float | число с плавающей точкой | double | число с плавающей точкой двойной точности | Векторные типы данных Образование наименования типа: <скалярный тип данных> vec <количество компонент>. Например, bvec4. Для доступа к компонентам вектора можно воспользоваться двумя способами: · обращение по индексу; · обращение к полям структуры (x, y, z, w или r, g, b, a или s, t, p, q) vec(2|3|4) | 2,3,4 компонентный вектор чисел с плавающей точкой. | dvec(2|3|4) | 2,3,4 компонентный вектор чисел с плавающей точкой двойной точности | bvec(2|3|4) | 2,3,4 компонентный вектор типа bool | ivec(2|3|4) | 2,3,4 компонентный вектор целых чисел | uvec(2|3|4) | 2,3,4 компонентный вектор беззнаковых целых | Матричные типы данных При выполнении операций над этими типами данных они всегда рассматриваются как математические матрицы. В частности, при перемножения матрицы и вектора получаются правильные с математической точки зрения результаты. Матрица хранится по столбцам и может рассматриваться как массив столбцов. mat(2|3|4) mat2x2 , mat3x3, mat4x4 | 2×2, 3×3, 4×4 матрица чисел с плавающей точкой | mat2x3, mat2x4 | матрица чисел с плавающей точкой с 2 столбцами и 3, 4 строками | mat3x2, mat3x4 | матрица чисел с плавающей точкой с 3 столбцами и 2, 4 строками | mat4x2, mat4x3 | матрица чисел с плавающей точкой с 4 столбцами и 2, 3 строками | dmat(2|3|4) dmat2x2 , dmat3x3, dmat4x4 | 2×2, 3×3, 4×4 матрица чисел с плавающей точкой двойной точности | dmat2x3, dmat2x4 | матрица чисел с плавающей точкой двойной точности с 2 столбцами и 3, 4 строками | dmat3x2, dmat3x4 | матрица чисел с плавающей точкой двойной точности с 3 столбцами и 2, 4 строками | dmat4x2, dmat4x3 | матрица чисел с плавающей точкой двойной точности с 4 столбцами и 2, 3 строками | Инициализаторы и конструкторы При объявлении переменных их можно инициализировать начальными значениями, подобно языкам C/C++: float f = 3.0; bool b = false; int i = 0; При объявлении сложных типов данных используются конструкторы. Они же применяются для преобразования типов: vec2 pos = vec2(1.0, 0.0); vec4 color = vec4(pos, 0.0, 1.0); vec3 color3 = vec3(color); bool b = bool(1.0); Структуры Структуры на языке шейдеров OpenGL похожи на структуры языка C/C++: struct Light { vec3 position; vec3 color; } ... Light pointLight; Все прочие особенности работы со структурами такие же, как в C. Ключевые слова union, enum и class не используются, но зарезервированы для возможного применения в будущем. Массивы Массивы. В языке шейдеров OpenGL можно создавать массивы любых типов: float values[10]; vec4 points[]; vec4 points[5]; Принципы работы с массивами те же, что и в языках C/C++. Шаг1 За основу берем приложение OpenGL из предыдущей темы. Будем рисовать треугольник с разноцветными вершинами. Шейдеры – это два текстовых файла. Их нужно загрузить с диска и скомпилировать в шейдерную программу. Создадим два пустых текстовых файла «basic.vs» для вершинного шейдера и «basic.fs» - для фрагментного. Управляющая программа Определение версий GLSL и OpenGL. Чтобы определить версии GLSL и OpenGL, поддерживаемые текущим драйвером достаточно воспользоваться функцией glGetString. string glVersion = GL.GetString(StringName.Version); string glslVersion = GL.GetString(StringName.ShadingLanguageVersion); Для хранения дескриптов шейдерной программы и шейдерных объектов, добавляем членами класса переменные: int BasicProgramID; int BasicVertexShader; int BasicFragmentShader; Загрузка шейдеров Executable Shader Program | void loadShader(String filename, ShaderType type, int program, out int address) { address = GL.CreateShader(type); using (System.IO.StreamReader sr = new StreamReader(filename)) { GL.ShaderSource(address, sr.ReadToEnd()); } GL.CompileShader(address); GL.AttachShader(program, address); Console.WriteLine(GL.GetShaderInfoLog(address)); } glCreateShader создаёт объект шейдера, её аргумент определяет тип шейдера, который может принимать значения из перечисления ShaderType: ComputeShader, FragmentShader, GeometryShader, GeometryShaderExt, TessControlShader, TessEvaluationShader, VertexShader. Функция возвращает значение, которое можно использовать для ссылки на объект вершинного шейдера (дескриптор). Если во время создания объекта шейдера возникнет ошибка, функция вернет 0. glShaderSource загружает исходный код в созданный шейдерный объект. Эта функция может принимать массив строк, поэтому есть возможность компилировать код сразу из множества источников. Эта функция копирует исходный код во внутреннюю память программы, занятую исходным кодом, можно освободить. Далее надо скомпилировать исходный шейдер, делается это вызовом функции glCompileShader() и передачей ей дескриптора шейдера, который требуется скомпилировать. Перед тем, как шейдеры будут добавлены в конвейер OpenGL их нужно скомпоновать в шейдерную программу с помощью функции glAttachShader(). На этапе компоновкипроизводится стыковка входных переменных одного шейдера с выходными переменными другого, а также стыковка входных/выходных переменных шейдеров с соответствующими областями памяти в окружении OpenGL. |