Question

Je suis nouveau à OpenGL / GLKit et ayant des problèmes avec le test de profondeur. L'image ci-dessous montre un poteau avec cinq faisceaux se croisent il. Tous se rencontrent au milieu (à l'intérieur du poteau), mais comme vous pouvez voir les parties des poutres qui sont destinés à être obscurci sont encore visibles. Ils scintillent comme un fou et la même chose quand je change la vue afin que les faisceaux se chevauchent sur l'écran. Si je ne glEnable (GL_CULL_FACE), il se produit dans chaque forme à savoir la face arrière des polygones arrière est dessiné et interfère avec la face avant du polygone avant.

entrer image description ici

Voici les extraits de code qui me semblent pertinents, je l'ai laissé de côté les choses sur la configuration des vertex et l'angle de vue. Espérons que quelqu'un reconnaîtra le problème et il y a une balle d'argent là-bas.

Dans mon contrôleur de vue

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

}

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

}

Je reconnais pleinement d'être très nouveau et inexpérimenté, alors je suis tout à fait ouvert à des critiques constructives si j'ai structuré l'application mal.

Cordialement, Craig

Était-ce utile?

La solution

La solution est venue de HannesSAK (http://www.iphonedevsdk.com/forum/iphone-sdk-development/5239-opengl-es-problem-depthbuffer-culling.html), il semble que l'établissement zNear comme 0.0f était mon problème. Je l'ai changé pour 1.0f et l'image rendue correctement.

self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(0.125*RADIANS, 2.0/3.0, 1.0f, 50.0f);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top