Pregunta

Soy nuevo en OpenGL/GLKIT y tengo problemas con las pruebas de profundidad. La imagen a continuación muestra una publicación con cinco vigas que lo cruzan. Todos se encuentran en el medio (dentro de la publicación), pero como puede ver las partes de las vigas que están destinadas a estar oscurecidas aún son visibles. Demolitan como locos y lo mismo sucede cuando cambio la vista para que las vigas se superpongan en la pantalla. Si no lo hago Glenable (GL_CULL_FACE), entonces ocurre dentro de cada forma, es decir, la cara posterior de los polígonos traseros se dibuja e interfiere con la cara delantera del polígono delantero.

enter image description here

Aquí están los fragmentos de código que creo que son relevantes, he dejado de lado las cosas sobre la configuración de los vértices y el ángulo de visión. Esperemos que alguien reconozca el problema y hay una bala de plata por ahí.

En mi controlador de vista

- (void)viewDidLoad
{
    [super viewDidLoad];    
    self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];    
    GLKView *view = (GLKView *)self.view;
    view.context = self.context;
    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    [self setupGL];
}


- (void)setupGL
{

    [EAGLContext setCurrentContext:self.context];
    self.effect = [[GLKBaseEffect alloc] init];

    self.effect.lightModelAmbientColor = GLKVector4Make(0.5, 0.5, 0.5, 1);
    self.effect.colorMaterialEnabled = GL_TRUE;
    self.effect.light0.enabled = GL_TRUE;    
    self.effect.light0.position = GLKVector4Make(2, 4, -5, 1);    
    self.effect.material.shininess = 10.0;    
    self.effect.material.specularColor = GLKVector4Make(0.5, 0.5, 1, 1);    
    self.effect.lightingType = GLKLightingTypePerPixel;

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);
    glDepthFunc(GL_LEQUAL);
}


- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{    
    glClearColor(0.2, 0.2, 0.2, 0.5);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    [self.effect prepareToDraw];
    [beams makeObjectsPerformSelector:@selector(draw)];    
    [post draw];

}

En Beam.m

-(void) draw
{
    self.effect.material.shininess = 15.0;    

    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, triangleVertices);

    glEnableVertexAttribArray(GLKVertexAttribColor);
    glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, triangleColours);

    glEnableVertexAttribArray(GLKVertexAttribNormal);
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 0, triangleNormals);


    glDrawArrays(GL_TRIANGLES, 0, 48);

    glDisableVertexAttribArray(GLKVertexAttribPosition);
    glDisableVertexAttribArray(GLKVertexAttribColor);
    glDisableVertexAttribArray(GLKVertexAttribNormal);

}

Admito que es muy nuevo e inexperto en esto, por lo que estoy bastante abierto a críticas constructivas si he estructurado mal la aplicación.

Saludos, Craig

¿Fue útil?

Solución

La solución vino de Hannessak (http://www.iphonedevsdk.com/forum/iphone-sdk-development/5239-opengl-esproblem-depthbuffer-culling.html) Parece que establecer Znear como 0.0f era mi problema. Lo cambié a 1.0f y la imagen se convirtió correctamente.

self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(0.125*RADIANS, 2.0/3.0, 1.0f, 50.0f);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top