2012-01-03 3 views
0

iOS에서 OPEN GL 1.0의 스텐실 버퍼를 사용하여 간단한 마스킹을위한 솔루션을 찾기 위해 애써 왔습니다.iOS에서 Open GL 1.0 스텐실 버퍼를 사용하여 마스킹 문제가 발생했습니다.

배경을 그린 다음 drawFrame을 사용하여 그리는 프레임 인 glPushMatrix를 사용하여 배경 위에 그립니다.

내 프레임은 스텐실 버퍼를 사용하여 maskTexture를 사용하여 마스크하려고하는 VideoFrameTexture로 구성됩니다. 내 목표는 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에서 깊이 버퍼를 가질 필요가 없기 때문에 좋습니다! –

+0

@ChristianRau : 이것은 단순히 사실이 아닙니다. (적어도 v1.1에서는 그렇지 않습니다.) 방금 OpenGL ES 1.1/iOS에서 스텐실 그림자 작업을했습니다. –