0

そのため、マスキング/クリッピングの目的で iOS でステンシル バッファを使用しようとしています。このコードが機能しない理由がわかりましたか? これは、私が Stencils に関連付けたすべてです。iOS 4 では、黒い画面が表示されます。iOS 5 では、期待どおりの結果が得られます。ステンシルに描いた画像の透明な部分だけが後で描かれます。

コードは以下です。

ここで、frameBuffer、深度、およびステンシルをセットアップします。iOS では、深度とステンシルが組み合わされています。

-(void)setupDepthBuffer
{
    glGenRenderbuffers(1, &depthRenderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8_OES, self.frame.size.width * [[UIScreen mainScreen] scale], self.frame.size.height * [[UIScreen mainScreen] scale]);
}

-(void)setupFrameBuffer
{    
    glGenFramebuffers(1, &frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderBuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthRenderBuffer);

    // Check the FBO.
    if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
        NSLog(@"Failure with framebuffer generation: %d", glCheckFramebufferStatus(GL_FRAMEBUFFER));
    }
}

これが、ステンシルを設定して描画する方法です。(以下のシェーダーコード。)

glEnable(GL_STENCIL_TEST);
glDisable(GL_DEPTH_TEST);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);

glStencilFunc(GL_ALWAYS, 1, -1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

glColorMask(0, 0, 0, 0);
glClear(GL_STENCIL_BUFFER_BIT);

machineForeground.shader = [StencilEffect sharedInstance];
[machineForeground draw];
machineForeground.shader = [BasicEffect sharedInstance];

glDisable(GL_STENCIL_TEST);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);

ステンシルを使っているところです。

glEnable(GL_STENCIL_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glStencilFunc(GL_EQUAL, 1, -1);

...Draw Stuff here

glDisable(GL_STENCIL_TEST);

最後に、これが私のフラグメント シェーダーです。

varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;

void main(void)
{
    lowp vec4 color = texture2D(Texture, TexCoordOut);

    if(color.a < 0.1)
        gl_FragColor = color;
    else
        discard;
}
4

1 に答える 1

0

シェーダーに対処することでこれを解決できました。このコードは意図したとおりに正常に動作しますが、頂点データ構造体は、シェーダーに提供したよりも多くのデータを要求していました。内部で何が起こったのか完全にはわかりませんが、iOS 5 で動作するようになりましたが、修正することができました。

そうは言っても

glColorMask(0, 0, 0, 0);

実際に私が目指していたものを達成しませんでした。私が欲しかったのはクリアカラーを設定することでしたが、それでもステンシルをクリアしたいだけだったので、実際に探していました

glStencilMask(1);
于 2012-08-30T03:35:33.517 に答える