Проблема с тестом глубины OpenGL

У меня проблема с OpenGL на Mac, и я думаю, что проблема в тесте глубины.

Итак, к моей проблеме: Вместо того, чтобы объяснять, я сделал два скриншота: Моя сцена издалека: : //c0848462.cdn.cloudfiles.rackspacecloud.com/dd2267e27ad7d0206526b208cf2ea6910bcd00b4fa.jpg А от близкого: http://c0848462.cdn.cloudfiles.rackspacecloud.com/dd2267e27a561b5f02344dca57508dddce21d2315f.jpg

Если я не нарисую зеленый пол, все выглядит (отчасти) хорошо. Но все равно в таком виде он выглядит просто устрашающе.

Вот три блока кода, которые я использую для настройки Opengl:

+ (NSOpenGLPixelFormat*) defaultPixelFormat
{
    NSOpenGLPixelFormatAttribute attributes [] = {
        NSOpenGLPFAWindow,
        NSOpenGLPFADoubleBuffer, 
        NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)16, 
        (NSOpenGLPixelFormatAttribute)nil
    };
    return [[[NSOpenGLPixelFormat alloc] initWithAttributes:attributes] autorelease];
}


- (void) prepareOpenGL
{
    NSLog(@"Preparing OpenGL");
    glClearColor( 0.0f, 0.0f, 1.0f, 1.0f );             

    glEnable(GL_TEXTURE_2D);                           

    glClearDepth(1);                                  
    glEnable(GL_DEPTH_TEST);                          

    glEnable (GL_BLEND);                              
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

- (void)reshape
{
    NSLog(@"Reshaping view");
    glViewport( 0, 0, (GLsizei)[self bounds].size.width, (GLsizei)[self bounds].size.height);
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 45.0, [self bounds].size.width / [self bounds].size.height, 0.1f /*Nearest render distance*/, 5000.0 /*Render distance*/);
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
} 

person Ivorius    schedule 08.07.2011    source источник
comment
Спасибо, что задали этот вопрос. Я не мог понять, почему GL_DEPTH_TEST не работает. После того, как я переопределил defaultPixelFormat и установил размер глубины, он начал работать.   -  person orangething    schedule 04.06.2012


Ответы (1)


gluPerspective( 45.0, [self bounds].size.width / [self bounds].size.height, 0.1f /*Nearest render distance*/, 5000.0 /*Render distance*/);

Это намного слишком мало для ближней плоскости отсечения. Чем ближе значение вашего ближнего клипа к 0, тем меньше точность вы получите для значений, которые находятся дальше. Отодвиньте ближний клип как минимум на 1,0, если не дальше. В общем, вы должны отодвинуть его как можно дальше.

О, и вы должны использовать 24-битный буфер глубины, а не 16-битный.

person Nicol Bolas    schedule 08.07.2011