Все ли тригонометрические функции HLSL используют радианы и как повернуть изображение? - PullRequest
0 голосов
/ 31 октября 2019

Я искал ответ на вопрос во всей доступной документации: Microsoft, wiki и за ее пределами.
Нет места для ответа на вопрос: "Все ли тригонометрические функции HLSL используют радианы?"
Я только что обнаружил в Microsoft, что параметры функций должны быть:

Каждый компонент должен иметь значение с плавающей запятой в диапазоне от -1 до 1.

Но это не говорит, если это радианы или градусы ...

Например, у меня есть Vertex Shader и координаты.
Мне нужно повернуть изображение на 10 °.
Я передаю10 в качестве параметра через постоянный буфер: fzAngle = 10.
Я использую преобразование через полярную систему координат.
Правильн ли следующий код?

Вершинный шейдер

float fzRadAngle = radians(fzAngle);
float2 ptPos = input.Pos.xy;
float polarAngle = atan(ptPos.y / ptPos.x);
float polarRadius = sqrt(pow(ptPos.x, 2) + pow(ptPos.y, 2));
polarAngle += fzRadAngle;
ptPos.x = polarRadius * cos(polarAngle);
ptPos.y = polarRadius * sin(polarAngle);

output.Pos.xy = ptPos.xy;
return output;

UPD Так что насчет вращения ... Даже если я не вращаюсь, а просто перемещаюсь между координатамисистемы, я получаю изображение вне диапазона (оно исчезает из целевой текстуры)

float fzRadAngle = radians(fzAngle);
float2 ptPos = input.Pos.xy;
float x = ptPos.x;
float y = ptPos.y;
float phita = atan(y / x);
float ro = sqrt(x * x + y * y);
x = ro * cos(phita);
y = ro * sin(phita);
ptPos.x = x;
ptPos.y = y;
output.Pos.xy = ptPos.xy;
return output;

И, как я вижу, проблема в расчете радиуса, поэтому, если я пропускаю ro, я получаю изображение обратно, как оно было:

float fzRadAngle = radians(fzAngle);
float2 ptPos = input.Pos.xy;
float x = ptPos.x;
float y = ptPos.y;
float phita = atan(y / x);
y = x * tan(phita);
ptPos.x = x;
ptPos.y = y;
output.Pos.xy = ptPos.xy;
return output;

UPD

Я нашел несколько интересных вещей.

Система координат:

[-1, 1, -1, 1]

В случаеэтот код, картинка не меняется:

float2 ptPos = input.Pos.xy;
float x = ptPos.x;
float y = ptPos.y;
float phita = atan(y / x);
float ro = sqrt(pow(x, 2) + pow(y, 2));
y = x * tan(phita);
ptPos.x = x;
ptPos.y = y;
output.Pos.xy = ptPos.xy;
return output;

В этом случае он исчезает:

float2 ptPos = input.Pos.xy;
float x = ptPos.x;
float y = ptPos.y;
float phita = atan(y / x);
float ro = sqrt(pow(x, 2) + pow(y, 2));
x = ro * cos(phita);
y = ro * sin(phita);
ptPos.x = x;
ptPos.y = y;
output.Pos.xy = ptPos.xy;
return output;

Даже если я пытаюсь добавить / подконструировать 1 или 0,5 из конечных значений x и y это не возвращает изображение в поле просмотра.

Здесь я просто пытаюсь преобразовать систему Decart в полярную и обратно.

...