Разработка шейдеров с HLSL Guennadi Riguer
ATI Technologies Inc. – Январь 2003 Обзор Материала Типы данных Операторы Конструкторы Управление исполнением шейдеров Функции Семантика деклараций
ATI Technologies Inc. – Январь 2003 High Level Shader Language (HLSL) HLSL в DirectX® 9 – язык шейдеров высокого уровня от Microsoft Преимущества языка HLSL –Все стандартные преимущества языков высокого уровня Более быстрая и простая разраборка Повторное использование кода и библиотек функций –Высокий уровень оптимизаций –Стандарт индустрии с гарантированной поддержкой всех видеокарт
ATI Technologies Inc. – Январь 2003 Типы Данных в HLSL Скалярные типы данных –bool – булевское значение –int – 32-битовое целочисленное значение со знаком –half – 16-битовое число с плавающей точкой –float – 32-битовое число с плавающей точкой –double – 64-битовое число с плавающей точкой Поддержка конкретных типов и их точность не гарантированы и зависит от аппаратной имплементации float fVar; const int iVar = 2;
ATI Technologies Inc. – Январь 2003 Типы Данных в HLSL Векторные данные –По умолчанию 4 компонента типа float –Предопределены все типы векторов (bool3, int2, float4, и т.д.) vector vVar; float4 vVar; int2 vVar1; Доступ к компонентам вектора vVar.х vVar[0]
ATI Technologies Inc. – Январь 2003 Типы Данных в HLSL Матричные данные –По умолчанию 4х4 элемента типа float –Предопределены все типы матриц (bool3х1, float4х4, и т.д.) matrix mVar; float4x4 vVar; int2x3 vVar1; Можно контролировать ориентaцию #pragma pack_matrix (row_major); Доступ к элементам и строкам матрицы mVar._m00, mVar._11, mVar[0][0] mVar._m00_m01_m02_m03, mVar[0]
ATI Technologies Inc. – Январь 2003 Типы Данных в HLSL Поддерживаются массивы Так же поддерживаются структуры float2 offs2D[5]; struct VERTEX { float3 Pos; float3 Norm; float2 TexCoord; }
ATI Technologies Inc. – Январь 2003 Приведение Типов Значения с плавающей точкой могут быть пререведены в вектора повторением Типы векторов и матриц могут быть приведены к меньшим типам данных –Данные копируется начиная с верхнего левого угла матрицы/вектора Структуры могут быть приведены к/из скалярных величин, векторов, матриц и других структур vVec3+0.5 vVec3+float3(0.5,0.5,0.5)
ATI Technologies Inc. – Январь 2003 Операторы Arithmetic-, +, *, /, % Prefix/postfix++, -- Boolean&&, ||, ?: Unary!, -, + Comparison, =, ==, != Assignment=, -=, +=, *=, /= Cast(type) Comma, Structure member. Array member[i][i]
ATI Technologies Inc. – Январь 2003 Операторы Умножение матрицы и вектора реализовано с помощью встроенной функции Оператор извлечения остатка деления (%) работает как с целыми числами, так и с числами с плавающей точкой Сравнение векторов производитсь по- компонентно Осторожней с целочисленной арифметикой –HLSL эмулирует целочисленные вычисления даже если аппаратные средства это не поддерживают –Округление может отличаться
ATI Technologies Inc. – Январь 2003 Конструкторы Конструкторы могут быть использованы для создания и инициализации объектов, как в C++ –Работает со всеми HLSL типами Возможна инициализация полей структуры –Приведение типа происходит автоматически если поля структуры и данные не совпадают float3 v3 = float3(0,0,0); float4 v4 = float4(0,0,0,0); float4 v4 = float4(v3,0);
ATI Technologies Inc. – Январь 2003 Управление исполнением шейдеров Ветвление Циклы Циклы поддерживаются всеми моделями шейдеров –По необходимости циклы раскручиваются компилятором if (expr) then statement [else statement] do statement while (expr); while (expr) statement; for (expr1;expr2;expr3) statement
ATI Technologies Inc. – Январь 2003 Функции Похоже на функции в C –HLSL автоматически проверяет типы –Поддерживаются прототипы функций –Аргументы передаются по значению Рекурсия не поддерживается Параметры функции могут быть семантически связаны с данными Большое кол-во предопределенных функций –Упрощается разработка –Оптимизированная реализация –Функции могут быть переопределены
ATI Technologies Inc. – Январь 2003 Функции Аргументы функций могут быть инициализированы по умолчанию Функции могут вернуть более одного значения float4 foo( in float v, out float a, inout float b = 0.5 ) { a = v * b; b = v / 2; return (a + b); }
ATI Technologies Inc. – Январь 2003 Встроенные Функции VS 1.1VS 2.0PS 1.1PS 1.4PS 2.0 dot, lerp, saturateXXXXX abs, clamp, isfinite, isnan, max, min, sign XXXX ceil, exp, exp2, floor, fmod, frac, frexp, isinf, ldexp, log, log2, log10, modf, pow, round, rsqrt, smoothstep, sqrt, step XXX Арифметические функции Тригонометрические функции VS 1.1VS 2.0PS 1.1PS 1.4PS 2.0 degrees, radiansXXXXX acos, asin, atan, atan2, cos, cosh, sin, sincos, sinh, tan, tanh XXX
ATI Technologies Inc. – Январь 2003 Встроенные Функции Векторные функции VS 1.1VS 2.0PS 1.1PS 1.4PS 2.0 reflectXXXXX all, any, cross, faceforwardXXXX distance, length, lit, normalize, refract XXX Матричные функции VS 1.1VS 2.0PS 1.1PS 1.4PS 2.0 mul, transposeXXXXX determinantXXX Прочие функции VS 1.1VS 2.0PS 1.1PS 1.4PS 2.0 D3DCOLORtoUBYTE4XX?
ATI Technologies Inc. – Январь 2003 Встроенные Функции Текстурные функции VS 1.1VS 2.0PS 1.1PS 1.4PS 2.0 tex1D, tex2D, tex3D, texCubeXXX tex1Dproj, tex2Dproj, tex3Dproj, texCUBEproj, tex1Dbias, tex2Dbias, tex3Dbias, texCUBEbias X clipXXX
ATI Technologies Inc. – Январь 2003 Семантика Деклараций Аргументы и возвращаемые значения функций могут быть семанически связаны с данными ввода/вывода шейдера –На пример POSITION, TEXCOORD1, и т.д. Константы могут быть привязаны к регистрам констант matrix worldViewProj : register(c0); Выборка текстур может быть привызана к конкретному текстурнику sampler noiseSampler : register(s0);
ATI Technologies Inc. – Январь 2003 Декларация Текстур // Декларация объекта текстуры texture tMarbleSpline; // Декларация текстурного блока // и параметров фильтрации sampler MarbleSplineSampler = sampler_state { Texture = (tMarbleSpline); MinFilter = Linear; MagFilter = Linear; MipFilter = Linear; AddressU = Clamp; AddressV = Clamp; MaxAnisotropy = 16; };
ATI Technologies Inc. – Январь 2003 Пример Вершинного Шейдера float4x4 matWorldViewProj; float4 vColor : register(c0); float4 SimpleVS(float4 inPos: POSITION) : POSITION { return mul(inPos, matWorldViewProj); } struct VS_OUTPUT { float4 vPos: POSITION; float4 vColor: COLOR; }; VS_OUTPUT ColorVertVS(float4 inPos: POSITION) { VS_OUTPUT o; o.vPos = SimpleVS(inPos); o.vColor = vColor; return o; }
ATI Technologies Inc. – Январь 2003 Пример Пиксельного Шейдера sampler TextureSampler; float4 vDiffuse; float4 vAmbient; float4 vLightPos; float4 LightPS(float3 Neye : TEXCOORD0, float3 Peye : TEXCOORD1, float2 inTexCoord : TEXCOORD2) : COLOR { float3 Leye = normalize(vLightPos – Peye); float NdotL = dot(Neye, Leye); return (NdotL * vDiffuse + vAmbient) * tex2D(TextureSampler, inTexCoord); }
ATI Technologies Inc. – Январь 2003 Вопросы