Здавалка
Главная | Обратная связь

Урок 9. Шейдеры в Direct3D11



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

Шейдеры

Из предыдущих уроков вы уже знакомы с шейдерами и применяли их практически. В данном уроке мы не будем использовать их как дополнение к приложению, а взглянем на сами шейдеры и на их код.

Сейчас шейдеры являются ключевым аспектом DirectX приложения. Фактически, трудно что-нибудь сделать без их использования. Вся графика игр, многочисленные спецэффекты, и тот реализм, который на сегодняшний день достигла графическая часть игр – это всё получилось благодаря использованию шейдеров. Взглянем лишь на некоторые примеры использования шейдеров:

  • Обычное применение: матрицы камеры и освещениями в вершинномшейдере, текстуры и определение текущего цвета пикселя в пиксельном шейдере
  • Композиции из нескольких текстур, использования глубоких текстур, для тонкой детализации ландшафта и моделей
  • Эффекты освещения и теней
  • Системы частиц – туман, задымление а также различные виды вспышек

На самом деле, данный список можно продолжать, кажется бесконечно. Существует слишком много примеров применения шейдеров, чтобы даже их просто перечислить. Запустите любую новую игру и существующий список применения шейдеров может быть пополнен несколькими, а то и десятками новых применений шейдеров.

Особенности компиляции и загрузки шейдера

Хотя шейдер является очень низкоуровневой структурой – он должен выполняться очень быстро, но вы можете его писать на языке, подобном C++, этот язык называется HLSL. Это потому, что шейдер на ходу компилируется в машинный код видеоускорителя. Кроме того, не нужен специальный компилятор. Язык HLSL является стандартным и его компиляция осуществляется на ходу любой 3d системой, например DirectX или OpenGL. Таким образом, вы просто указываете на исходный файл формата .fx и он автоматически загружается, компилируется и выполняется непосредственно в вашем 3d приложении.

Язык HLSL

Взглянем на пример шейдера с точки зрения программирования. Посмотрим на типичный код шейдера:

//------------------------------------------------------------------------------------ // Constant Buffer Variables //------------------------------------------------------------------------------------ Texture2D txDiffuse : register( t0 ); SamplerState samLinear : register( s0 ); //------------------------------------------------------------------------------------ cbuffer ConstantBuffer: register( b0 ) { matrix World; matrix View; matrix Projection; float4 vMeshColor;   }; //------------------------------------------------------------------------------------ struct VS_INPUT { float4 Pos : POSITION; float2 Tex : TEXCOORD0; };   struct PS_INPUT { float4 Pos : SV_POSITION; float2 Tex : TEXCOORD0; }; //------------------------------------------------------------------------------------ // Vertex Shader //------------------------------------------------------------------------------------ PS_INPUT VS( VS_INPUT input ) { PS_INPUT output = (PS_INPUT)0; output.Pos = mul( input.Pos, World ); output.Pos = mul( output.Pos, View ); output.Pos = mul( output.Pos, Projection ); output.Tex = input.Tex;   return output; } //------------------------------------------------------------------------------------ // Pixel Shader //------------------------------------------------------------------------------------ float4 PS( PS_INPUT input) : SV_Target { return txDiffuse.Sample( samLinear, input.Tex ) * vMeshColor; }

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

Типы данных HLSL

В каждом языке существуют различные встроенные типы данных. В языке HLSL типы данных носят некоторый математический оттенок, то есть в нем много типов данных наподобие векторов и матриц. Итак, таблица типов данных HLSL:

Тип данных Примечание
Buffer Массив
Scalar Одно компонентная скалярная величина
Vector,Matrix Несколько компонентный вектор или матрица
Sampler, Texture Встроенные типы данных – сэмплер, текстура
Struct, User Defined Пользовательский тип данных

Рассмотрим эти типы данных. Тип данных Scalar определяет скалярную величину и может быть одним из следующих:

bool int uint half float double

Тип данных Vector и Matrix обозначается добавлением количества компонент к типу данных scalar. Например, Float4 определяет четырехкомпонентный вектор. Для матрицы, например Float4x4 добавляется NxN, то есть указывается размеренность матрицы. Пример определения вектора и матрицы:

float3 fVector = { 0.2f, 0.3f, 0.4f }; double3x3 dMatrix; float2x2 fMatrix = { 0.0f, 0.1, // row 1 2.1f, 2.2f // row 2 };

Типы Sampler используется для описания типа фильтрации текстуры. Тип Texture для указания на используемую текстуру. Примеры определений для этих типов данных, тип данных Sampler и Texture:

Texture2D txDiffuse : register( t0 ); SamplerState samLinear : register( s0 );

ТипданныхTexture:

float4 Color=txDiffuse.Sample( samLinear, input.Tex ) * vMeshColor;






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.