2016-05-21 2 views
0

パーティクルをゲームにカプセルとして描画します(2つのGL_POINTS、2つのGL_TRIANGLES)。すべてがうまく一括して三角形を描画し、次にポイントを2番目に描画します(2つの描画呼び出しは合計)。単純なパーティクルとのブレンド

私の問題は、OpenGLではGL_POINTSを自分自身で丸めなければならないということです。これはフラグメントシェーダでこれを行っています。

precision highp float; 

varying float outColor; 

vec3 hsv2rgb(vec3 c) 
{ 
    vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0); 
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); 
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); 
} 

void main() 
{ 
    vec2 circCoord = 2.0 * gl_PointCoord - 1.0; 
    gl_FragColor = vec4(hsv2rgb(vec3(outColor/360.0, 1.0, 1.0)) , step(dot(circCoord, circCoord), 1.0)); 
} 

問題は、粒子が二つの別々の引き分けに描かれているので、私はまた、深度ソートを行う必要があるが、彼らは2つのドローコールに描かれているので、時にはz位置が深さバッファリングせずに正しくない呼び出します。

深度バッファーがあり、丸められた点はよく混合されていません。丸みを帯びた粒子ではなく、周囲に黒い領域があります。何か案は?

いくつかの余分なノート

: 私はイオスのOpenGL ESを行っています(私は信じているタイルベースの遅延レンダリング)

各粒子が最初に二点、現在の場所と、それが最後のフレームにあった場所として定義されます。これらの2つのポイントは、GL_POINTSで後で描画されます。次に、矩形部分は、2つの点のベクトルに垂直なベクトルを見つけることによって決定された2つの三角形で作られる。

また、パーティクルは、前から後の順にソートされています。技術的には、そのzポジションは任意ですが、私はそれらをそのまま保つ必要があります。

+0

は、私はあなたがデスクトップのOpenGLまたはOpenGL ESを使用しているかどうかの好奇心。 –

+0

@NicolBolas私はそれを投稿に追加しました。それは意味をなさないでしょうか? –

+0

私は同じZ座標を受け入れる深さテスト条件を使うことから始めますが、それはZファイティングを完全に解決しません。その後、私は2回目の描画呼び出しを取り除き、すべてをシングルパスでレンダリングします。そのためにはシェーダを変更する必要がありますので、三角形の真ん中にいる場合は、ポイントをレンダリングしてください。あなたがしようとしていることがわからなければ、これはちょうど仕事を推測することです。いくつかのサンプル画像を追加します。あなたが2番目の描画を取り除くことができない場合、カメラ空間のZ軸にオフセットを付けて(頂点シェーダー内で)点をレンダリングしますが、三角形が交差する場合は機能しません – Spektre

答えて

1

また、パーティクルは、前から後の順にソートされています。技術的には、そのzポジションは任意ですが、私はそれらをそのまま保つ必要があります。

私はあなたの問題だと思っています。

点は正方形です。あなたはそれらを丸く見せるためにブレンドを行うことができますが、ジオメトリ(したがって深度の値)は依然として正方形です。ポイントの背後にあるものは、着色された丸い領域の外側にあるコーナーによってZ-失敗している。

アルゴリズムを完全に変更することなく、これを修正するには、点ではなく三角形メッシュを使用するか(実際のジオメトリが丸みを帯びるようにする)か、ラウンド領域外にあるポイントピクセルのフラグメントシェーダでdiscardフラグメントあなたは守りたい。比較的高価なことなので、そのアプローチのパフォーマンスをチェックすることができシェーダでdiscardを使用して

注...

+0

私はそれについていくつかの研究を行いました。アップルのデバイスは異なるレンダリングパイプラインを使用していることがわかります。これは、まず問題を引き起こします。私はフラグメントポジションのドットプロダクトに基づいて廃棄物を使用して試しました。それは驚くほど耐え難いほどの遅延を伴いました!これをAndroidに移植すると、状況が異なる可能性があります。 –