我正在使用 Metal 编写一个 3D 应用程序。对于 3D 渲染,我需要控制每个像素。在普通屏幕中,这似乎与传递给着色器的 [[position]] 变量一起工作正常。但是在 Retina 显示器中,有一个缩放因子,每个屏幕坐标代表 2x2(或 3x3)像素。
让我以 iPhone 6 屏幕为例进行详细说明:屏幕坐标为 375x667,像素坐标为 750x1334。这是我的(测试)着色器代码:
fragment half4 myFragShader(vtxOut in [[stage_in]],
float4 pcoord [[position]])
{
if(pcoord.x >187.5) //187.5=375/2
return half4(1.0 , 0.0 , 0.0, 1.0); // return red
else return half4(0.0 , 0.0 , 1.0, 1.0); // return blue
}
使用上面的测试代码,我(完全)将屏幕的左半部分变为蓝色,将右半部分变为红色。这意味着 pcoord 来自 375x667 坐标系,而不是 750x1334。
问题:
是否会为每个像素坐标调用片段着色器?还是仅适用于每个屏幕坐标?
如果每个像素坐标都调用它,我如何访问片段着色器中的每个像素?
我对 pcoord.y (在我上面的代码中)进行了同样的尝试,结果相似。