2012-01-03 66 views
0

我一直在努力尋找在iOs上使用OPEN GL 1.0中的Stencil Buffer進行簡單屏蔽的解決方案。在iOs中使用Open GL 1.0模板緩衝區進行屏蔽問題

我繪製背景,然後使用glPushMatrix繪製使用drawFrame繪製的框架,然後使用它繪製頂部。

我的框架是由VideoFrameTexture構成的,我嘗試使用模板緩衝區使用maskTexture進行遮罩。我的目標是僅將部分videoFrameTexture(由我的蒙版的白色區域定義,並對應於圓形)繪製到背景上。

我使用下面的代碼,但不考慮蒙版圖像。這是一個黑色和白色的PNG。

-(void) drawFrame{ 

GLfloat vertexes[] = 
{ 
    -1.0f, -1.0f, 0.0f, 
    1.0f, -1.0f, 0.0f, 
    1.0f, 1.0f, 0.0f, 
    -1.0f, 1.0f, 0.0f 
}; 
GLshort texes[] = { 
    1, 1, 
    0, 1, 
    0, 0, 
    1, 0, 
}; 

glColor4f(1.0, 1.0, 1.0, 1.0); 
glVertexPointer(3, GL_FLOAT, 0, vertexes); 
glEnableClientState(GL_VERTEX_ARRAY); 
glTexCoordPointer(2, GL_SHORT, 0, texes); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 


glDisable(GL_DEPTH_TEST); 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 

glEnable(GL_STENCIL_TEST); 
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); 
glStencilFunc(GL_ALWAYS, 1, 0xffffffff); 


/// Mask Drawing 
glBindTexture(GL_TEXTURE_2D, maskTexture); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 
glEnable(GL_DEPTH_TEST); 
glStencilFunc(GL_EQUAL, 1, 0xffffffff); /* draw if ==1 */ 
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 


///Frame Drawing 
glBindTexture(GL_TEXTURE_2D, videoFrameTexture); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

glDisable(GL_STENCIL_TEST); 


glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 


glDeleteTextures(1, &videoFrameTexture); 

} 

我用下面的代碼畫出我的觀點:

- (void) drawView 
{ 
[EAGLContext setCurrentContext:context]; 
//glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT| GL_STENCIL_BUFFER_BIT); 

    glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -10.0f, 10.0f); 
    glViewport(0, 0, backingWidth, backingHeight); 

    glMatrixMode(GL_MODELVIEW); 

glPushMatrix(); 
glScalef(1, 0.75, 1); 
glTranslatef(0, -1, 0); 
glRotatef(90, 0.0f, 0.0f, 1.0f); 
[self drawBackground]; 
glPopMatrix(); 

glPushMatrix(); 

glScalef(1, 1, 1); 
glTranslatef(0, 1, 0); 
glRotatef(90, 0.0f, 0.0f, 1.0f); 
[self drawFrame]; 
glPopMatrix(); 

//present frame buffer 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
[context presentRenderbuffer:GL_RENDERBUFFER_OES]; 
} 

回答

1

模板緩存不適用於1.0。只有2.0

+0

什麼? ES 1.0沒有模板緩衝區?真?我研究了這個規範,它確實表示不需要包含深度或模板緩衝區(儘管它可以支持模板操作)。太棒了,所以你甚至不需要在ES 1.0中擁有深度緩衝區,太棒了! – 2012-11-07 13:47:30

+0

@ChristianRau:這根本不是真的(至少不是v1.1),我剛剛在OpenGL ES 1.1/iOS上獲得了模板陰影。 – 2013-06-14 21:16:22