OpenGL GL_DEPTH_TEST无法正常工作

mel*_*lka 10 opengl objective-c

我只是将一个.obj加载器移植到objective-C,到目前为止,它可以工作,我可以得到我的顶点和法线和东西.每个法线都很好,指向正确的方向,我所有的脸都处于CCW缠绕状态,但我在深度测试中遇到了一些问题.

float rotX = 0;
float rotY = 0;
objModel* o = [[objModel alloc] initWithPath:@"/model.obj"]

glClearColor(0,0,0,0);

glEnable(GL_DEPTH_TEST);
glFrontFace(GL_CCW);
glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();   
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslated(0, -1, 0);
glRotatef(90,0,0,1);
glRotatef(90,0,1,0);
glRotatef(rotX,0,0,-1);
glRotatef(rotY,0,1,0);

[o drawObjWithArrays]

glFlush();
Run Code Online (Sandbox Code Playgroud)

我有2种不同的绘制对象的方法,一种使用glBegin()/ glEnd(),另一种使用顶点和普通数组调用glDrawArrays().它们都会导致同样的问题:显示应该被它们前面的面隐藏的面,因为深度测试不起作用.面孔按照它们在.obj文件中的顺序绘制.

你会在这里找到一个图像:http://img524.imageshack.us/img524/994/image2jgq.png

我对OpenGL和Objective-C很新,所以我想我的问题来自于我忘记的设置.他们来了 :

-(id) initWithFrame:(NSRect) frame {
NSLog(@"INIT GL VIEW\n");

GLuint attributes[] = {
    NSOpenGLPFANoRecovery,
    NSOpenGLPFAWindow,
    NSOpenGLPFAAccelerated,
    NSOpenGLPFADoubleBuffer,
    NSOpenGLPFAColorSize, 24,
    NSOpenGLPFAAlphaSize, 8,
    NSOpenGLPFADepthSize, 24,
    NSOpenGLPFAStencilSize, 8,
    NSOpenGLPFAAccumSize, 0,
    0
};

NSOpenGLPixelFormat* fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes:(NSOpenGLPixelFormatAttribute*) attributes];
if (!fmt)
    NSLog(@"No OpenGL pixel format");

GLfloat   mat_ambient[]     = {0.0, 0.0, 1.0, 1.0};
GLfloat   mat_flash[]       = {0.0, 0.0, 1.0, 1.0};
GLfloat   mat_flash_shiny[] = {50.0};
GLfloat   light_position[]  = {100.0,-200.0,-200.0,0.0};
GLfloat   ambi[]            = {0.1, 0.1, 0.1, 0.1};
GLfloat   lightZeroColor[]  = {0.9, 0.9, 0.9, 0.1};

/* set the material */
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambi);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor);

glMaterialfv(GL_FRONT, GL_SHININESS, mat_flash_shiny);  
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);

return self = [super initWithFrame:frame pixelFormat:[fmt autorelease]]; 
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?我已经尝试过每个人glDepthFunc,glCullFace,glFrontFace组合可能,没有任何作用......

谢谢^^

cob*_*bal 14

将此添加到绘图方法后会得到什么?

int depth;
glGetIntegerv(GL_DEPTH_BITS, &depth);
NSLog(@"%i bits depth", depth)
Run Code Online (Sandbox Code Playgroud)

还有一些事情要尝试:

  • 确保调用initWithFrame
  • 如果您正在使用IB的NSOpenGLView子类,请在IB中设置深度缓冲区,并将所有openGL初始化移动到 - (void)prepareOpenGL

  • 哇,谢谢,它有效.我不知道你必须在IB中设置参数.现在我有24位深度,在我的视图中没有更多问题^^ (2认同)

gas*_*ard 8

如果有人想知道如何在没有IB的情况下设置它:

NSOpenGLPixelFormatAttribute attrs[] = {
    // NSOpenGLPFADoubleBuffer,
    NSOpenGLPFADepthSize, 32,
    0
};
NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
NSOpenGLView *view = [[NSOpenGLView alloc] initWithFrame:frame pixelFormat:format];
Run Code Online (Sandbox Code Playgroud)