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];
}
무엇? ES 1.0에는 스텐실 버퍼가 없습니다. 정말? 스펙을 살펴보면 구현에 깊이 또는 스텐실 버퍼를 포함 할 필요가 없다고 명시되어 있습니다 (스텐실 작업은 지원되지만 스텐실 작업이 지원됨). ES 1.0에서 깊이 버퍼를 가질 필요가 없기 때문에 좋습니다! –
@ChristianRau : 이것은 단순히 사실이 아닙니다. (적어도 v1.1에서는 그렇지 않습니다.) 방금 OpenGL ES 1.1/iOS에서 스텐실 그림자 작업을했습니다. –