Введение в программирование трехмерных игр с DX9

       

Матричные типы


16.3.3. Матричные типы

HLSL предоставляет следующие встроенные матричные типы:

matrix — Матрица 4 × 4 все элементы которой имеют тип float.

matrix<T, m, n> — Матрица размера m × n, каждый элемент которой относится к скалярному типу T. Размеры матрицы m и n могут принимать значения от 1 до 4. Вот пример матрицы целых чисел, размером 2 × 2:

matrix<int, 2, 2> m2x2;

Кроме того, мы можем объявить матрицу m × n, где m и n — числа в диапазоне от 1 до 4, используя следующий синтаксис:

floatmxn matmxn;

Примеры:

float2x2 mat2x2; float3x3 mat3x3; float4x4 mat4x4; float2x4 mat2x4;

ПРИМЕЧАНИЕ

Тип не обязательно должен быть float — можно использовать и другие типы. Например, мы можем объявлять целочисленные матрицы:

int2x2 i2x2; int2x2 i3x3; int2x2 i2x4;

Мы можем обращаться к элементам матрицы, используя синтаксис доступа к элементу массива по двум индексам. Например, для установки значения элемента (i, j) матрицы M, следует писать:

M[i][j] = value;

Кроме того, мы можем обращаться к элементам матрицы M как к членам структуры. Определены следующие имена элементов:

Если нумерация начинается с единицы:

M._11 = M._12 = M._13 = M._14 = 0.0f; M._21 = M._22 = M._23 = M._24 = 0.0f; M._31 = M._32 = M._33 = M._34 = 0.0f; M._41 = M._42 = M._43 = M._44 = 0.0f;

Если нумерация начинается с нуля:

M._m00 = M._m01 = M._m02 = M._m03 = 0.0f; M._m10 = M._m11 = M._m12 = M._m13 = 0.0f; M._m20 = M._m21 = M._m22 = M._m23 = 0.0f; M._m30 = M._m31 = M._m32 = M._m33 = 0.0f;

Иногда нам будет требоваться сослаться на отдельный вектор-строку матрицы. Это делается с использованием синтаксиса доступа к элементу массива по индексу. Например, чтобы получить i-ый вектор-строку матрицы M, следует написать:

vector ithRow = M[i]; // получить i-ый вектор-строку в M

ПРИМЕЧАНИЕ

Для инициализации переменных в HLSL можно применять два варианта синтаксиса. Первый — синтаксис инициализации структуры:

vector u = {0.6f, 0.3f, 1.0f, 1.0f}; vector v = {1.0f, 5.0f, 0.2f, 1.0f};

Или эквивалентный стиль конструктора:

vector u = vector(0.6f, 0.3f, 1.0f, 1.0f); vector v = vector(1.0f, 5.0f, 0.2f, 1.0f);

Вот еще несколько примеров:

float2x2 f2x2 = float2x2(1.0f, 2.0f, 3.0f, 4.0f); int2x2 m = {1, 2, 3, 4}; int n = int(5); int a = {5}; float3 x = float3(0, 0, 0);

Содержание раздела