3

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 で来ることを意味します。

質問:

  1. フラグメント シェーダーはすべてのピクセル座標に対して呼び出されますか? それとも、すべてのスクリーン座標に対してのみですか?

  2. すべてのピクセル座標に対して呼び出される場合、フラグメント シェーダー内の各ピクセルにアクセスするにはどうすればよいですか?

pcoord.y (上記のコード) で同じことを試してみましたが、同様の結果が得られました。

4

2 に答える 2

1

これは私自身の答えです:

一部の単純なプロジェクトがシェーダー コードで正確なピクセル座標を提供しない理由を見つけることはできませんでしたが、私が作成した他のいくつかのプロジェクトでは、ピクセル座標 (画面のスケーリング ファクターを含む) で座標が提供されました。つまり、上記の例のように、750x1334ではなく、座標を取得し375x667ました。

だから、私が投稿した2つの質問に答えるために:

  1. フラグメント シェーダーは、ピクセル座標ごとに呼び出され、
  2. in.position.xyシェーダー コード内の座標を指定します。

screen-coordiantes で座標を提供するプロジェクトで何が問題になっているのかがわかったら、これを更新します。

于 2015-03-19T12:34:54.610 に答える