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 ^^
Se ha agregado a la función drawRect, devuelve "0 bits de profundidad". No parece correcto ... – melka
así que ahí está tu problema. – shoosh
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