gpt4 book ai didi

c++ - 像素和顶点着色器中的缩放问题

转载 作者:行者123 更新时间:2023-11-27 23:36:48 25 4
gpt4 key购买 nike

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

缩放 ~ 0.77 的 PS 结果:
(对于VS大体相同)

0.7 scaling

缩放比例为 0.1 的 PS 结果:
(对于VS大体相同)

0.5 scaling

再次。 PS 具有合乎逻辑的行为。缩放因子越大,我们得到的图像越小,因此除以较小的数字会产生更大的数字...
为什么 VS 与乘法结果相同?

最佳答案

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

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

关于c++ - 像素和顶点着色器中的缩放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58624873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com