【问题标题】:OpenGL GL_DEPTH_TEST not workingOpenGL GL_DEPTH_TEST 不工作
【发布时间】:2010-02-18 01:03:22
【问题描述】:

我刚刚将一个 .obj 加载器移植到了 Objective-C,到目前为止,它可以工作,我可以获得我的顶点和法线之类的东西。 每个法线都很好,指向正确的方向,我所有的脸都在逆时针缠绕,但深度测试有一些问题。

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();

我有 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]]; 
}

有人可以帮助我吗?我已经尝试过所有可能的 glDepthFunc、glCullFace、glFrontFace 组合,但没有任何效果...

谢谢^^

【问题讨论】:

    标签: objective-c opengl


    【解决方案1】:

    当你将它添加到你的 draw 方法时你会得到什么?

    int depth;
    glGetIntegerv(GL_DEPTH_BITS, &depth);
    NSLog(@"%i bits depth", depth)
    

    还有几件事要尝试:

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

    【讨论】:

    • 将其添加到 drawRect 函数中,返回“0 位深度”。好像不对……
    • 哇,谢谢,它成功了。我不知道你必须在 IB 中设置参数。现在我有 24 位深度,在我看来不再有问题 ^^
    • 如果您需要代码在没有 NIB 的情况下执行此操作,我将其发布在下面(无法在 cmets 中格式化代码)。
    • 我已经为这个问题苦苦挣扎了一段时间。这让我找到了正确的解决方案。
    【解决方案2】:

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

    NSOpenGLPixelFormatAttribute attrs[] = {
        // NSOpenGLPFADoubleBuffer,
        NSOpenGLPFADepthSize, 32,
        0
    };
    NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
    NSOpenGLView *view = [[NSOpenGLView alloc] initWithFrame:frame pixelFormat:format];
    

    【讨论】:

      【解决方案3】:

      确保调用glDepthFunc() 设置深度缓冲区比较功能。大多数应用程序使用GL_LEQUALGL_LESS 作为深度函数。还要确保调用glClearDepth() 来设置深度缓冲区被清除的值;您可能应该使用1.0 的参数来清除最大深度。

      【讨论】:

      • 我刚试了一下,还有glDepthFunc的其他参数,没什么新意...:/
      【解决方案4】:

      我不确定适当的 AGL 调用应该是什么样子,但您应该确保实际为深度缓冲区分配位平面。

      【讨论】:

        猜你喜欢
        • 2014-07-30
        • 1970-01-01
        • 1970-01-01
        • 2015-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多