2009-06-06 18 views
10

Właśnie przeniesiłem program ładujący .obj na obiekt C i jak na razie działa, mogę uzyskać moje wierzchołki, normalne i inne. Każdy normalny jest dobry, wskazujący we właściwym kierunku, wszystkie moje twarze są w uzwojeniu CCW, ale mam pewne problemy z testem głębokości.OpenGL GL_DEPTH_TEST nie działa

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

mam 2 różne sposoby rysunek mojego obiektu, używa glBegin()/glEnd(), drugi wykorzystuje wierzchołków i normalnych tablic z wezwaniem do glDrawArrays(). Oba wywołują ten sam problem: wyświetlane są twarze, które powinny być ukryte przed nimi przed sobą, ponieważ test głębokości nie działa. Twarze są rysowane w kolejności, w jakiej występują w pliku .obj.

Znajdziesz obraz tutaj: http://img524.imageshack.us/img524/994/image2jgq.png

ja zupełnie nowego do OpenGL i Objective-C, więc myślę, że mój problem jest z ustawieniem, że zapomniałem. Oto one:

-(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]]; 
} 

Ktoś może mi pomóc? Próbowałem każdy glDepthFunc, glCullFace, glFrontFace kombinacja możliwe, nic nie działa ...

Dzięki ^^

Odpowiedz

14

co otrzymasz, dodając to do swojej metody losowania?

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

Jeszcze kilka rzeczy, aby spróbować:

  • upewnić initWithFrame jest nazywany
  • jeśli używasz podklasy NSOpenGLView z IB, ustawić bufor głębokości w IB i przenieść wszystko Twój inicjalizacji openGL do - (void)prepareOpenGL
+0

Dodano go do funkcji drawRect, zwraca "0 bitów głębokości". Nie wydaje się właściwe ... – melka

+0

, więc masz swój problem. – shoosh

+2

Wow, dzięki, zadziałało. Nie wiedziałem, że musisz ustawić parametry w IB. Teraz mam 24 bity głębokości i nie ma więcej problemów w moim widoku ^^ – melka

0

nie jestem pewien, w jaki sposób właściwe AGL wzywa powinien wyglądać, ale należy upewnić się, że rzeczywiście przeznaczyć bitowe dla bufora głębokości.

1

Upewnij się, że dzwonisz pod numer glDepthFunc(), aby ustawić funkcję porównywania bufora głębi. Większość aplikacji używa funkcji GL_LEQUAL lub GL_LESS dla funkcji głębi. Upewnij się również, że wywołujesz glClearDepth(), aby ustawić wartość, do której bufor głębokości zostanie wyczyszczony; powinieneś prawdopodobnie użyć parametru 1.0, aby to wyczyścić do maksymalnej głębokości.

+0

Po prostu wypróbowałem to, z innymi parametrami dla glDepthFunc, nic nowego ...:/ – melka

8

W przypadku gdy ktoś zastanawia się, jak ustawić to bez IB:

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