2016-11-15 8 views
0

これは基本的な質問のように思えるかもしれませんが、OpenGLのシェーダの助けを借りて作成したオブジェクトをどのように扱い/操作できますか?シェーダから操作するOpenGLオブジェクト

ホストプログラムで異なるオブジェクトの座標を必要としています。それらの座標に基づいて異なるオブジェクトを作成/操作し、それらを頂点/フラグメント/ジオメトリシェーダに戻します。

私は私が私のメインプログラムで定義されていることが、私の最初の頂点座標を持っているが、彼らはジオメトリシェーダに達すると、位置を経由して計算されます。

gl_Position = projection_matrix * view_matrix * vec4(square_point,1); 
EmitVertex(); 

そして今、例えば、私がする必要があります画面上でマウスで選択して移動します。しかし、私は正確な座標を得ることを考えることができる簡単な方法はありません。 私はメインプログラムで位置計算をしようとしましたが、ジオメトリシェーダで計算された座標と同じ座標を取得していないようです。そして、CPU上ですべてを計算することは、私が持っているオブジェクトの数に対して実際には最適ではありません。

私はいくつかのGPU-> CPUデータの取り出しをバッファー経由で行うことを考えましたが、非常に多くのオブジェクトと非常に多くの座標があり、それは執拗です。

私は、これにアプローチする別の方法があると思います。ちょうど私がOpenGLの仕組みについて適切な知識を持っていない可能性があります。

+0

変換後に 'w'座標を正しく扱っていますか?これはジオメトリシェイダーが実行された後に起こるステップ(4つのベクトルコンポーネントすべてをそれに分割する)です。放出された頂点をキャプチャしてそれらを比較しても、このステップはまだ実行されていません。 –

+0

@ AndonM.Coleman - そうは思わない。私は質問に入れた正確な公式を適用しています。 –

答えて

0

シェーダストレージバッファオブジェクトSSBOと呼ばれるものを使用できます。 buffer修飾子を使用してシェーダで作成します。次に、必要な計算を行い、glMapBufferRangememcpyでデータをダウンロードします。

関連する問題