私はMonotouchとopenTKを使ってiOS用のパーティクルエンジンを書いています。私のアプローチは、各パーティクルの座標を投影し、このスクリーン位置に正確にスケーリングされたテクスチャ付き矩形を書き込むことです。3Dスプライト、正しいデプスバッファ情報を書き込む
正常に動作しますが、正しい奥行き値を計算するのに問題があり、スプライトが正しくオーバードローされ、シーンの3Dオブジェクトによってオーバードラングされるようになります。
//d=distance to projection plane
float d=(float)(1.0/(Math.Tan(MathHelper.DegreesToRadians(fovy/2f))));
Vector3 screenPos=Vector3.Transform(ref objPos,ref viewMatrix, out screenPos);
float depth=1-d/-screenPos.Z;
を次に私はz座標として上記算出奥行き値を置く場所をスクリーン座標でtrianglestrip描画午前:
これは私が今日使用しているコードです。
結果はほぼ正確ですが、それほど正確ではありません。私は遠く離れたクリッピング・プレーンをどうにかする必要があると思う(私の場合、1は近く、10000は遠い)が、どうやってどうなるかわからない。正確な結果を得ることなく、さまざまな方法とアルゴリズムを試しました。
私はこれについていくつかの助けに感謝したいと思います。
これは物事について奇妙な方法のように思えます。 ES 1.1にはポイントスプライト拡張機能が組み込まれており、ES 2.0では頂点シェーダに関連することを実行しています.CPUでこの変換を行う理由はありますか? – Tommy
私はOpenGlの初心者ですので、私が厄介な方法でそれをすれば私を許してください。 :)しかし、私が理解しているように、通常のパイプラインを使用する場合は、パーティクルごとにローテーション行列を作成して、常にカメラに向かうようにする必要があります。これは私が避けたいオーバーヘッドを与えてくれます。また、あなたが直面している間にあなたを近づけている場合、そのようなカメラが看板に向くような視点効果を見たくないこともあります。私はES 2.0を使用しています。 – sinsro
いいえ、幾何学的に考える必要はありません。ちょうどその点の位置を指定し、OpenGLにその点に2dの形を付けることができます。 ES 1.1のポイントスプライト拡張を使って実現できますが、2.0では頂点シェーダに組み込み出力 'gl_PointSize'を、フラグメントシェーダに組み込み入力' gl_PointCoord'を使用することができます。私は私の答えを編集して、かなり長いことを言っていました。 – Tommy