像素和顶点着色器的缩放问题

问题描述 投票:0回答:1

我有两个着色器:像素和顶点。他们两个都旋转图像。阶段之一是缩放图片。两种情况下的比例因子均为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 / fScaleptPos.x * fScale

PS的缩放比例约为0.77:(对于VS几乎是相同的)

0.7 scaling

PS缩放为0.1的结果:(对于VS几乎是相同的)

0.5 scaling

再次。 PS具有逻辑行为。比例因子越大,我们的门就越小,因此除以较小的数字会产生较大的数字...为什么VS与乘法运算的结果相同?

c++ hlsl
1个回答
3
投票

在所写的像素着色器中,缩放因子应用于范围为[0,1]的UV坐标(ptPos.xy),该范围用于采样纹理。如您所提到的,将UV值除以减小的值将按比例缩小纹理采样,从而使图像缩小。发生这种情况是因为UV坐标与该PS中的像素位置有关,并且随着缩放比例的增加,更多像素将映射到[0,1]中。

顶点着色器输出形成顶点的顶点,在每个像素上调用像素着色器。将VS中的每个顶点乘以增加的比例因子将有效地增加执行像素着色器的屏幕空间区域。这就是为什么在VS中将输出顶点位置乘以增加的缩放比例会生成更大的缩放图像的原因。

© www.soinside.com 2019 - 2024. All rights reserved.