2009-06-06 4 views
10

.obj 로더를 objective-C에 이식했는데 지금까지 작동 했으므로 꼭지점과 법선을 얻을 수 있습니다. 모든 정상적인 것이 좋으며, 올바른 방향을 가리키며, 모든 얼굴은 CCW 와인딩 상태입니다. 그러나 깊이 테스트에 몇 가지 문제가 있습니다. OpenGL GL_DEPTH_TEST가 작동하지 않습니다.

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 파일의 순서대로 그려집니다.

당신은 여기에서 이미지를 확인할 수있는 것들 : OpenGL을하고 객관적인-C에 나는 아주 새로운 http://img524.imageshack.us/img524/994/image2jgq.png

을, 그래서 나는 내 문제는 내가 잊었 설정에서 오는 것 같아요. 여기에 있습니다 :

-(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 조합, 아무것도 작동하지 않습니다 ...

감사합니다 ^^

답변

14

이것을 그리기 방법에 추가하면 어떻게됩니까? 당신이 IB에서 NSOpenGLView의 서브 클래스를 사용하는 경우 initWithFrame

  • 호출되고, IB의 깊이 버퍼를 설정해야합니다

    • 을, 모든 이동 :

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

      몇 가지 시도 경우 누군가에 - (void)prepareOpenGL

  • +0

    drawRect 함수에 추가되어 "0 비트 깊이"를 반환합니다. 옳은 것 같지 않습니다 ... – melka

    +0

    그래서 문제가 있습니다. – shoosh

    +2

    와우, 고마워, 효과가 있었다. IB에서 매개 변수를 설정해야한다는 것을 알지 못했습니다. 이제 깊이가 24 비트이고 더 이상 문제가되지 않습니다. ^^ – melka

    0

    내가 적절한 AGL이 같아야 호출하는 방법을 잘 모르겠어요하지만 당신은 당신이 실제로 할당 확인해야 깊이 버퍼 용 비트 평면

    1

    깊이 버퍼 비교 기능을 설정하려면 glDepthFunc()으로 전화하십시오. 대부분의 응용 프로그램은 깊이 함수에 GL_LEQUAL 또는 GL_LESS을 사용합니다. 또한 깊이 버퍼가 지워지는 값을 설정하려면 glClearDepth()으로 전화하십시오. 최대 깊이까지 지우려면 1.0 매개 변수를 사용해야합니다.

    +0

    glDepthFunc에 대한 다른 매개 변수와 함께 새로운 시도가 없습니다./ – melka

    8

    에 당신의 OpenGL을 초기화 IB없이 설정하는 방법을 궁금해 :

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