0

Monotouch と openTK を使用して iOS 用のパーティクル エンジンを作成しています。私のアプローチは、各パーティクルの座標を投影してから、この画面の位置に正しくスケーリングされたテクスチャ付きの四角形を書き込むことです。

正常に動作しますが、スプライトが正しくオーバードローされ、シーン内の 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 座標として配置する画面座標に三角ストリップを描画します。

結果はほぼ正しいですが、完全ではありません。どうにかして近距離と遠距離のクリッピング プレーンを考慮する必要があると思います (私の場合、近距離は 1、遠距離は 10000 です) が、その方法がわかりません。正確な結果が得られずに、さまざまな方法やアルゴリズムを試しました。

これについて何か助けていただければ幸いです。

4

1 に答える 1

1

本当にやりたいことは、ソースの位置を取得し、モデルビューとプロジェクション、または固定パイプラインを使用していない場合に設定したものを介して渡すことです。glFrustumなどのスタックを設定するために標準呼び出しの 1 つを使用し、それ以外の場合は ID のままにしておくと、man ページから関連する式を直接取得できます。したがって、それを直接読み取ると、次のように変換されます。

z_clip = -( (far + near) / (far - near) ) * z_eye - ( (2 * far * near) / (far - near) )
w_clip = -z

次に、最後に:

z_device = z_clip / w_clip;

編集:ES 2.0で作業しているため、実際には問題を完全に回避できます。レンダリング用のジオメトリを GL_POINTS として指定し、頂点シェーダーで通常の変換を実行しますがgl_PointSize、そのポイントのピクセル単位のサイズに設定します。

フラグメント シェーダーgl_PointCoordでは、ポイントの一部である各フラグメントのテクスチャ座標を読み取るために読み取ることができます。単一の色だけが必要ない場合は、ポイント スプライトを描画できます。

于 2011-12-08T14:30:27.017 に答える