Почему эта настройка буфера глубины не работает - PullRequest
0 голосов
/ 22 февраля 2012

В последнее время я изучаю OpenGL (Какао). И я столкнулся с проблемой здесь. Когда я пытаюсь инициализировать буфер глубины, компилятор возвращает GDB: Program received signal: "EXC_BAD_ACCESS". Вот код:

-(id)init {
[super init];

[self initGL];

return self;
}

-(void)initGL {
glClearDepth( 1.0 );                     // Depth buffer setup
glEnable( GL_DEPTH_TEST );                // Enable depth testing
glDepthFunc( GL_LEQUAL );
}
-(void) drawRect: (NSRect)bounds {

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, 1.33333f, 0.1f, 100.0f);

glTranslatef(-1.5f, 0.0f, -6.0f);
glRotatef(10, 1.0f, 0.0f, 0.0f);
glRotatef(10, 0.0f, 1.0f, 0.0f);
glRotatef(10, 0.0f, 0.0f, 1.0f);

glBegin( GL_TRIANGLES );              // Draw a triangle
glColor3f( 1.0f, 0.0f, 0.0f );        // Set color to red
glVertex3f(  0.0f,  1.0f, 0.0f );     // Top of front
glColor3f( 0.0f, 1.0f, 0.0f );        // Set color to green
glVertex3f( -1.0f, -1.0f, 1.0f );     // Bottom left of front
glColor3f( 0.0f, 0.0f, 1.0f );        // Set color to blue
glVertex3f(  1.0f, -1.0f, 1.0f );     // Bottom right of front

glColor3f( 1.0f, 0.0f, 0.0f );        // Red
glVertex3f( 0.0f, 1.0f, 0.0f );       // Top of right side
glColor3f( 0.0f, 0.0f, 1.0f );        // Blue
glVertex3f( 1.0f, -1.0f, 1.0f );      // Left of right side
glColor3f( 0.0f, 1.0f, 0.0f );        // Green
glVertex3f( 1.0f, -1.0f, -1.0f );     // Right of right side

glColor3f( 1.0f, 0.0f, 0.0f );        // Red
glVertex3f( 0.0f, 1.0f, 0.0f );       // Top of back side
glColor3f( 0.0f, 1.0f, 0.0f );        // Green
glVertex3f( 1.0f, -1.0f, -1.0f );     // Left of back side
glColor3f( 0.0f, 0.0f, 1.0f );        // Blue
glVertex3f( -1.0f, -1.0f, -1.0f );    // Right of back side

glColor3f( 1.0f, 0.0f, 0.0f );        // Red
glVertex3f( 0.0f, 1.0f, 0.0f );       // Top of left side
glColor3f( 0.0f, 0.0f, 1.0f );        // Blue
glVertex3f( -1.0f, -1.0f, -1.0f );    // Left of left side
glColor3f( 0.0f, 1.0f, 0.0f );        // Green
glVertex3f( -1.0f, -1.0f, 1.0f );     // Right of left side
glEnd();

glFlush();
}

Если я уберу 3 строки тестирования глубины, приложение откроется без проблем.

1 Ответ

0 голосов
/ 22 февраля 2012

Есть ли контекст OpenGL, сделанный текущим, когда вызывается initGL? Проще всего этого добиться, поместив все вызовы в init в функцию рисования - , где они на самом деле принадлежат, потому что в OpenGL .

ничего не нужно инициализировать.

Действительно, ребята, если бы вы следовали этому простому совету делать все, что связано с рисованием в функции рисования, 80% проблем OpenGL в мире исчезли бы.

Кстати: ваш код нарисует только обрезанный куб, потому что вы все еще работаете с матрицей представления модели тождества, что означает, что некоторые из ваших вершин выходят перед ближней плоскостью отсечения. Хорошо, если это станет скайбоксом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...