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 が 750x1334 ではなく、座標系 375x667 で来ることを意味します。
質問:
フラグメント シェーダーはすべてのピクセル座標に対して呼び出されますか? それとも、すべてのスクリーン座標に対してのみですか?
すべてのピクセル座標に対して呼び出される場合、フラグメント シェーダー内の各ピクセルにアクセスするにはどうすればよいですか?
pcoord.y (上記のコード) で同じことを試してみましたが、同様の結果が得られました。