2009-06-06 29 views
10

Acabo de portar un cargador .obj al objetivo C y hasta ahora, funciona, puedo obtener mis vértices y normales y esas cosas. Todo lo normal es bueno, apuntando en la dirección correcta, todas mis caras están enrolladas en CCW, pero tengo algunos problemas con la prueba de profundidad.OpenGL GL_DEPTH_TEST no funciona

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

tengo 2 maneras diferentes de dibujo mi objetivo, se utiliza glBegin()/glEnd(), el otro utiliza vértice y matrices normales con una llamada a glDrawArrays(). Ambos provocan el mismo problema: se muestran las caras que deberían estar ocultas por las caras delante de ellos, porque la prueba de profundidad no funciona. Las caras se dibujan en el orden en que aparecen en el archivo .obj.

Encontrará una imagen aquí: http://img524.imageshack.us/img524/994/image2jgq.png

I bastante nuevo para OpenGL y Objective-C, por lo que supongo que mi problema viene de un entorno que se me olvidó. Aquí están:

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

¿Alguien me puede ayudar? todos los que he intentado glDepthFunc, glCullFace, glFrontFace combinación posible, nada funciona ...

Gracias ^^

Respuesta

14

¿Qué obtienes cuando agregas esto a tu método de sorteo?

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

Un par de cosas más para probar:

  • asegurarse initWithFrame se está llamando
  • si está utilizando una subclase NSOpenGLView del IB, establecer el buffer de profundidad en el IB, y se mueven todos su inicialización openGL en - (void)prepareOpenGL
+0

Se ha agregado a la función drawRect, devuelve "0 bits de profundidad". No parece correcto ... – melka

+0

así que ahí está tu problema. – shoosh

+2

Guau, gracias, funcionó. No sabía que tenía que establecer los parámetros en IB. Ahora tengo una profundidad de 24 bits y no hay más problema en mi vista ^^ – melka

0

No estoy seguro de cómo el AGL apropiada llama debe ser similar pero debe asegurarse de que realmente asignar planos de bits para el buffer de profundidad.

1

Asegúrese de llamar al glDepthFunc() para establecer la función de comparación del búfer de profundidad. La mayoría de las aplicaciones usan GL_LEQUAL o GL_LESS para la función de profundidad. También asegúrese de llamar al glClearDepth() para establecer el valor al que se borrará el búfer de profundidad; probablemente debas usar un parámetro de 1.0 para que este desaparezca a la profundidad máxima.

+0

Acabo de probarlo, con otros parámetros para glDepthFunc, nada nuevo ...:/ – melka

8

En caso de que alguien se pregunta cómo hacer esto sin IB:

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