为什么这个深度缓冲设置不起作用

时间:2012-02-22 09:48:23

标签: cocoa opengl

我最近一直在学习OpenGL(Cocoa)。我在这里遇到了一个问题。当我尝试初始化深度缓冲区时,编译器返回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 :(得分:0)

调用initGL时是否有一个当前的OpenGL上下文?最简单的方法就是将init中的所有调用放入绘图函数 - 它们实际所属的位置,因为没有什么可以在OpenGL中进行初始化

真的,如果你按照这个简单的建议去做与绘图功能相关的所有事情,80%的世界OpenGL问题就会消失。

BTW:你的代码只会绘制一个剪切的立方体,因为你仍然在标识模型视图矩阵上运行,这意味着你的一些顶点在近剪裁平面之前出现。如果那要成为一个天空盒就好了。