Проблема масштабирования в пиксельном и вершинном шейдерах - PullRequest
0 голосов
/ 30 октября 2019

У меня есть два шейдера: пиксельный и вершинный.
Оба они вращают изображения.
Один из этапов - масштабирование изображения. Коэффициент масштабирования в обоих случаях равен 0,77328159.
Следуйте шейдерам и результатам процесса.
Вопрос в том, почему для пиксельных шейдеров мы делим коэффициент масштабирования, а для вершинных шейдеров мы его умножаем?
Сколькочем больше коэффициент масштабирования, тем более умиротворяющая картина.

Пиксельный шейдер

float fRadAngle = radians(fAngle);
float2 ptOrigin = input.Tex;
float2 ptPos = ptOrigin;
ptOrigin.x = (ptOrigin.x - 0.5) * fWidthSrc;
ptOrigin.y = (ptOrigin.y - 0.5) * fHeightSrc;
ptPos.x = ptOrigin.x * cos(fRadAngle) - ptOrigin.y * sin(fRadAngle);
ptPos.y = ptOrigin.x * sin(fRadAngle) + ptOrigin.y * cos(fRadAngle);
ptPos.x = ptPos.x / fWidthSrc;
ptPos.y = ptPos.y / fHeightSrc;
ptPos.x = ptPos.x / fScale + 0.5;
ptPos.y = ptPos.y / fScale + 0.5;
float4 pxRGB = float4( 0.0, 0.0, 0.0, 0.0 );
if( ptPos.x >= 0 && ptPos.x <= 1 && ptPos.y >= 0 && ptPos.y <= 1 )
    pxRGB = tx.Sample(sampler_in, ptPos);
return pxRGB;

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

float2 ptPos = input.Pos.xy;
float2 ptOrigin = ptPos;
ptOrigin.x = (ptOrigin.x - 0.5) * fWidthSrc;
ptOrigin.y = (ptOrigin.y - 0.5) * fHeightSrc;
ptPos.x = ptOrigin.x * cos(fzRadAngle) - ptOrigin.y * sin(fzRadAngle);
ptPos.y = ptOrigin.x * sin(fzRadAngle) + ptOrigin.y * cos(fzRadAngle);
ptPos.x = ptPos.x / fWidthSrc;
ptPos.y = ptPos.y / fHeightSrc;
ptPos.x = ptPos.x * fScale + 0.5;
ptPos.y = ptPos.y * fScale + 0.5;

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

Установить отношение к: ptPos.x / fScale и ptPos.x * fScale

Результат PS с масштабированием ~ 0,77:
(Для VS это в основном то же самое)

0.7 scaling

Результат PSс масштабированием 0,1:
(для VS это в основном то же самое)

0.5 scaling

Опять. PS есть логичное поведение. Чем больше коэффициент масштабирования, тем меньше получаемое нами изображение, поэтому деление на меньшее число приводит к большему числу ...
Почему VS дает то же самое с умножением?

1 Ответ

3 голосов
/ 30 октября 2019

В пиксельном шейдере, как написано, коэффициент масштабирования применяется к UV-координате (ptPos.xy) в диапазоне [0, 1], который используется для выборки текстуры. Как вы упомянули, деление этого UV на уменьшающееся значение уменьшит выборку текстуры так, чтобы изображение уменьшилось. Это происходит потому, что координаты UV связаны с положением пикселя в этом PS, и когда коэффициенты масштабирования увеличиваются, большее количество пикселей будет отображаться в [0,1].

Вершинный шейдер выводит вершины, которые образуют примитивы, для которых пиксельный шейдер вызывается для каждого пикселя. Умножение каждой вершины в VS на увеличивающийся коэффициент масштабирования эффективно увеличит область пространства экрана, над которой выполняется пиксельный шейдер. Вот почему умножение позиции выходной вершины на увеличивающийся коэффициент масштабирования в VS приводит к большему масштабированному изображению.

...