Frage

Ich bin neu bei OpenGL/GLKIT und habe Probleme mit Tiefentests. Das Bild unten zeigt einen Beitrag mit fünf Strahlen, die ihn schneiden. Sie alle treffen sich in der Mitte (innerhalb des Pfostens), aber wie Sie sehen können, sind die Teile der Strahlen, die, um verdeckt zu sein, immer noch sichtbar. Sie flackern wie verrückt und dasselbe passiert, wenn ich die Ansicht ändere, so dass sich die Strahlen auf dem Bildschirm überlappen. Wenn ich nicht glühend (GL_CULL_FACE) bin, geschieht es in jeder Form, dh die Rückseite der hinteren Polygone wird gezeichnet und stört die vordere Fläche des vorderen Polygons.

enter image description here

Hier sind die Codeausschnitte, die ich für relevant halte. Ich habe das Zeug zum Einrichten der Scheitelpunkte und des Betrachtungswinkels ausgelassen. Hoffentlich wird jemand das Problem erkennen und da draußen gibt es eine Silberkugel.

Meiner Ansichtsregler

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

}

Ich gebe voll und ganz zu, dass ich sehr neu und unerfahren war, daher bin ich ziemlich offen für konstruktive Kritik, wenn ich die App schlecht strukturiert habe.

Prost, Craig

War es hilfreich?

Lösung

Die Lösung stammte von Hannessak (http://www.iphonedevsdk.com/forum/iphone-sdk-development/5239-opengl-es-problem-pepthbuffer-culling.html) Es scheint, dass das Einstellen von ZNear als 0,0F mein Problem war. Ich habe es auf 1.0F geändert und das Bild korrekt gemacht.

self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(0.125*RADIANS, 2.0/3.0, 1.0f, 50.0f);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top