Скажем, у нас есть геометрический шейдер (модель 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 *.
Кроме того, этот геометрический шейдер создает рекламные щиты, поэтому я не могу рассчитать эти матрицы на ЦП, поскольку каждый рекламный щит будет иметь разные матрицы.