1

私はopengl es 2.0で単純な四角形にpngをレンダリングしていますが、四角形の後ろに何かを描画しようとすると、上の四角形の透明な領域が背景と同じ色でレンダリングされます。

すべてのレンダリング呼び出しの開始時にこれらを呼び出しています。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable (GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
4

3 に答える 3

5

理解した。フラグメントシェーダーで破棄できます

mediump vec4 basecolor = texture2D(sTexture, TexCoord);

if (basecolor.a == 0.0){
    discard;
}

gl_FragColor = basecolor;
于 2011-05-12T22:23:59.963 に答える
5

あなたのタイトルは本質的にあなたの質問に対する答えです!

一般に、透明度は、最初にシーン内のすべての不透明なオブジェクトをレンダリングし (Z バッファに何が見えるかを把握させます)、次にすべての透明なオブジェクトを後ろから前にレンダリングすることによって行われます。

于 2011-05-12T21:52:45.610 に答える
5

Drew Hall は良い答えをくれましたが、別のオプションは で設定glEnable(GL_ALPHA_TEST)することglAlphaFunc(GL_GREATER, 0.1f)です。これにより、透明なピクセル (この場合、アルファ < 0.1f のピクセル) がまったくレンダリングされなくなります。そうすれば、それらは Z バッファに書き込まれず、他のものが「透けて見える」可能性があります。ただし、これは完全に透明なオブジェクトでのみ機能します。また、0.1 アルファ エッジがある場所には粗いエッジがあり、オブジェクトに比べてピクセルが大きい遠方のフィーチャでは見栄えが悪くなります。

于 2011-05-12T22:01:38.403 に答える