Transcript Document
Разработка шейдеров с HLSL Guennadi Riguer [email protected] Обзор Материала • • • • • • Типы данных Операторы Конструкторы Управление исполнением шейдеров Функции Семантика деклараций 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; vector<float,4> vVar; float4 vVar; int2 vVar1; • Доступ к компонентам вектора vVar.х vVar[0] ATI Technologies Inc. – Январь 2003 Типы Данных в HLSL • Матричные данные – По умолчанию 4х4 элемента типа float – Предопределены все типы матриц (bool3х1, float4х4, и т.д.) matrix mVar; matrix<float,4,4> 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] 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.1 VS 2.0 PS 1.1 PS 1.4 PS 2.0 dot, lerp, saturate X X X X X abs, clamp, isfinite, isnan, max, min, sign X X X X ceil, exp, exp2, floor, fmod, frac, frexp, isinf, ldexp, log, log2, log10, modf, pow, round, rsqrt, smoothstep, sqrt, step X X X Тригонометрические функции VS 1.1 VS 2.0 PS 1.1 PS 1.4 PS 2.0 degrees, radians X X X X X acos, asin, atan, atan2, cos, cosh, sin, sincos, sinh, tan, tanh X X ATI Technologies Inc. – Январь 2003 X Встроенные Функции Векторные функции VS 1.1 VS 2.0 PS 1.1 PS 1.4 PS 2.0 reflect X X X X X all, any, cross, faceforward X X X X distance, length, lit, normalize, refract X X VS 1.1 VS 2.0 PS 1.1 PS 1.4 PS 2.0 mul, transpose X X X X X determinant X X VS 1.1 VS 2.0 X X X Матричные функции X Прочие функции D3DCOLORtoUBYTE4 PS 1.1 ATI Technologies Inc. – Январь 2003 PS 1.4 PS 2.0 ? Встроенные Функции Текстурные функции VS 1.1 VS 2.0 PS 1.1 PS 1.4 PS 2.0 X X X tex1D, tex2D, tex3D, texCube tex1Dproj, tex2Dproj, tex3Dproj, texCUBEproj, tex1Dbias, tex2Dbias, tex3Dbias, texCUBEbias clip X X ATI Technologies Inc. – Январь 2003 X X Семантика Деклараций • Аргументы и возвращаемые значения функций могут быть семанически связаны с данными ввода/вывода шейдера – На пример 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 Вопросы ATI Technologies Inc. – Январь 2003