Domanda

Sono nuovo per OpenGL/GLKIT e ho problemi con i test di profondità. L'immagine sotto mostra un post con cinque travi che lo intersecano. Si incontrano tutti nel mezzo (all'interno del post) ma come puoi vedere le parti dei raggi che devono essere oscurati sono ancora visibili. Famperono come un matto e la stessa cosa accade quando cambio la vista in modo che i raggi si sovrappongano sullo schermo. Se non vado in giro (GL_CULL_FACE), succede all'interno di ogni forma, cioè la backface dei poligoni posteriori viene disegnata e interferisce con la faccia anteriore del poligono anteriore.

enter image description here

Ecco gli snippet di codice che penso siano rilevanti, ho escluso le cose sull'impostazione dei vertici e dell'angolo di visualizzazione. Spero che qualcuno riconoscerà il problema e c'è un proiettile d'argento là fuori.

Nel mio controller di visualizzazione

- (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];

}

In 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);

}

Ammetto pienamente di essere molto nuovo e inesperto a questo, quindi sono abbastanza aperto a critiche costruttive se ho strutturato male l'app.

Saluti, Craig

È stato utile?

Soluzione

La soluzione è venuta da Hannessek (http://www.iphonedevsdk.com/forum/iphone-sdk-development/5239-opengl-es-problem-depthbuffer-culling.html) sembra che l'impostazione di zota come 0.0f fosse il mio problema. L'ho cambiato in 1.0f e l'immagine resa correttamente.

self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(0.125*RADIANS, 2.0/3.0, 1.0f, 50.0f);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top