2016-09-13 22 views
4

ジオメトリシェーダのエントリポイントから、画面内のポイントの座標を取得するにはどうすればよいですか? SceneKitは行列変換とその逆の束を公開していますが(https://developer.apple.com/reference/scenekit/scnshadable> SceneKitが提供する入力を使用して)、それらを使用する方法を理解できませんでした...SceneKit - 画面座標の位置を取得

たとえば、頂点シェーダで実行されるジオメトリエントリポイント

varying vec2 screen_coords; 

#pragma body 
screen_coords = (u_inverseModelViewProjectionTransform * _geometry.position).xy 

が、それは明確にするために:(

を動作するようには思えない、私はあればscreen_coordsは[0、1] * [0、1]になりたい:、私が試してみましたポイントは正確な位置に応じて画面に表示され、そうでない場合は何かが表示されます。

答えて

2

それは私にしばらく時間がかかったが、ここでは、次のとおりです。

vec4 screenPos = u_modelViewProjectionTransform * _geometry.position; 
screen_coords = (screenPos.xy/screenPos.w + 1.0) * 0.5; 

説明: screenPosは大体画面空間内の座標に対応しています。 screenPos.xy/screenPos.wこれらの座標を再スケールします。それで奇妙なことに、これは入力[-1、1] * [-1、1]を与えるので、結果的に[0、1]の結果を得るためにオフセットとスケールを追加しました* [0,1]

+0

あなたが見ることができますhttp://www.songho.ca/opengl/gl_projectionmatrix.htmlには投影、クリップスペース、正規化されたデバイス座標についての素晴らしい説明があります。 – mnuages

関連する問題