0

glPoints のアルファ ブレンディングに問題があります。glPoint が背景の上にある場合、アルファ ブレンディングは正しく機能しますが、glPoint が別の glPoint と重なっている場合、下にある glPoint ではなく背景色が表示されます。

ここに画像の説明を入力

// create texture

    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);

    // Draw

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glBindTexture(GL_TEXTURE_2D, tex);
    ....
    glDrawArrays(GL_POINTS, 0, numberOfPoints);

    // Frag Shader

    uniform sampler2D Texture; 

    void main(void) 
    {
        gl_FragColor = texture2D(Texture, gl_PointCoord); 
    }

私は何を間違っていますか?

4

1 に答える 1

2

深度テストが問題を引き起こしているようです。あなたが説明したように、最初に前の点が描かれ、深さの値が置き換えられます。次に、背後のポイントがラスタライズされますが、すべてのフラグメントが深度テストに失敗するため、それ以上レンダリング/ブレンドされることはありません。

  1. Andon M. Coleman が指摘したように、正しくアルファ ブレンディングを行うには、フラグメントを深さの順にソートする必要があります (正確な順序に依存しない透明度は、現在のところ、パーティクルに対して非現実的ですが、いくつかの近似手法を試すことはできます。次のようにアルファ値を使用してすべての色を平均化する重みもまともな結果をもたらす可能性があります)。

  2. 特に、あなたが持っている粒子密度と粒子間の変動の欠如については、おそらくソートする場合としない場合に大きな違いはありません。この場合、最初にすべての不透明なものを描画し、深度テストを有効にしてから、パーティクルを描画してください。深度テストを有効にしたままにして、パーティクルが不透明なものの背後にあるときに描画されないようにしたいが、お互いを覆い隠したくない - テストに深度バッファを使用したいが、深度値を書きたくない. これには、glDepthMaskを使用します。

于 2013-09-11T04:37:33.463 に答える