Предварительно ли компилятор HLSL D3D11 вычисляет матрицы? - PullRequest
0 голосов
/ 24 февраля 2019

Скажем, у нас есть геометрический шейдер (модель 5.0) в HLSL с матрицей для масштабирования и матрицей для перевода:

float4x4 scale;
scale[0] = float4( s,   0.0f, 0.0f, 0.0f);
scale[1] = float4(0.0f,  s,   0.0f, 0.0f);
scale[2] = float4(0.0f, 0.0f,  s,   0.0f);
scale[3] = float4(0.0f, 0.0f, 0.0f, 1.0f);

float4x4 translation;
translation[0] = float4(1.0f, 0.0f, 0.0f, 0.0f);
translation[1] = float4(0.0f, 1.0f, 0.0f, 0.0f);
translation[2] = float4(0.0f, 0.0f, 1.0f, 0.0f);
translation[3] = float4( x,    y,    z,   1.0f);

Здесь s - коэффициент масштабирования, а x,y, z - количество переводов по каждой оси.Мы можем объединить эти матрицы в одну матрицу, умножив их:

float4x4 combined;
combined = mul(scale, translation);

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

float4x4 combined;
combined[0] = float4( s,   0.0f, 0.0f, 0.0f);
combined[1] = float4(0.0f,  s,   0.0f, 0.0f);
combined[2] = float4(0.0f, 0.0f,  s,   0.0f);
combined[3] = float4( x,    y,    z,   1.0f);

Приведенный выше пример действительно прост, но у меня есть всего 4 матрицы с масштабированием, поворотом и переводом, так что, как вы понимаете, объединенная матрица будет довольно громоздкой для инициализациинапрямую.

Таким образом, если бы компилятор делал это во время компиляции, было бы лучше инициализировать матрицы отдельно для удобства чтения, но если он не объединяет их во время компиляции, а во время выполнения, он будетлучше сделать инициализацию объединенной матрицы из соображений производительности.

Таким образом, мой вопрос:

Будет ли компилятор автоматически объединять эти матрицы во время компиляции?

В настоящее время я использую функцию D3DCompileFromFile для компиляции шейдера.Я не знаю, использует ли эта функция тот же компилятор, что и в Visual Studio, но если это не так, а в Visual Studio - лучше, я могу вместо этого скомпилировать шейдеры во время сборки, а затем просто прочитать *Файл 1025 *.

Кроме того, этот геометрический шейдер создает рекламные щиты, поэтому я не могу рассчитать эти матрицы на ЦП, поскольку каждый рекламный щит будет иметь разные матрицы.

1 Ответ

0 голосов
/ 24 февраля 2019

Хотя компилятор HLSL будет выполнять некоторые оптимизации, а драйвер будет выполнять дополнительную оптимизацию при преобразовании байт-кода шейдера компилятора в аппаратный микрокод, существуют ограничения на то, насколько агрессивно можно сравнивать компилятор HLSL с традиционными компиляторами C / C ++..

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

cbuffer Parameters : register(b0)
{
    float4x4 World
    float3x3 WorldInverseTranspose
    float4x4 WorldViewProj
};

Здесь мы предоставляем матрицу мира, обратную транспонированность матрицы мира и предварительно составленную матрицу проекции мира-вида.

...