2012-02-22 68 views
0

我最近一直在学习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行深度测试中,打开应用程序的无缝连接。

回答

0

在调用initGL时是否有OpenGL上下文?通过将init中的所有调用放入其实际属于的绘图函数 - 中,因为在OpenGL中没有任何关于初始化的内容,所以很容易实现。

真的很帅,如果你遵循了这个简单的建议去做与绘图功能相关的所有事情,世界上80%的OpenGL问题都会消失。

顺便说一句:你的代码只会绘制一个剪裁的立方体,因为你仍然在标识模型视图矩阵上运行,这意味着你的一些顶点在剪裁平面之前出现。这很好,如果这是成为一个天空盒虽然。