3

私は OpenGL/GLKit が初めてで、深度テストに問題があります。下の図は、5 つのビームが交差しているポストを示しています。それらはすべて中央 (ポストの内側) で集まりますが、ご覧のように、隠されるはずの梁の部分がまだ見えています。それらは狂ったようにちらつき、ビームが画面上で重なるようにビューを変更すると同じことが起こります。glEnable(GL_CULL_FACE) を使用しないと、各シェイプ内で発生します。つまり、背面ポリゴンの背面が描画され、前面ポリゴンの前面と干渉します。

ここに画像の説明を入力

関連すると思われるコード スニペットを次に示します。頂点と視野角の設定に関する内容は省略しています。うまくいけば、誰かが問題を認識し、そこに特効薬があるでしょう.

私のビューコントローラで

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

}

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

}

私はこれに関して非常に新しく、経験が浅いことを完全に認めているので、アプリの構成が不十分である場合は、建設的な批判に対して非常にオープンです.

乾杯、クレイグ

4

1 に答える 1

3

解決策はHannesSAK(http://www.iphonedevsdk.com/forum/iphone-sdk-development/5239-opengl-es-problem-depthbuffer-culling.html)からのもので、zNearを0.0fに設定することが私の問題だったようです。1.0fに変更すると、画像が正しくレンダリングされました。

self.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(0.125*RADIANS, 2.0/3.0, 1.0f, 50.0f);
于 2011-12-11T02:18:52.633 に答える