OpenGL GL_DEPTH_TEST не работает
Я просто портировал загрузчик .obj на objective-C, и до сих пор он работает, я могу получить свои вершины и нормали и прочее.
Все нормальные хорошо, указывая в правильном направлении, все мои лица в обмотке CCW, но у меня есть некоторые проблемы с тестом на глубину.
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();
У меня есть два разных способа рисования моего объекта, один использует 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 возможна, ничего не работает...
Спасибо ^^
Ответы
Ответ 1
что вы получаете, когда добавляете это в свой метод draw?
int depth;
glGetIntegerv(GL_DEPTH_BITS, &depth);
NSLog(@"%i bits depth", depth)
Еще несколько вещей, которые нужно попробовать:
- убедитесь, что initWithFrame вызывается
- Если вы используете подкласс NSOpenGLView из IB, установите буфер глубины в IB и переместите всю свою инициализацию openGL в
- (void)prepareOpenGL
Ответ 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_LEQUAL
или GL_LESS
для функции глубины. Также убедитесь, что вы вызываете glClearDepth()
, чтобы установить значение, которое очищается буфером глубины; вы должны, вероятно, использовать параметр 1.0
для этого, чтобы очистить до максимальной глубины.
Ответ 4
Я не уверен, как должны выглядеть соответствующие вызовы AGL, но вы должны убедиться, что вы фактически распределяете битовые плоскости для буфера глубины.