OpenGL GL_DEPTH_TEST не работает - PullRequest
10 голосов
/ 07 июня 2009

Я просто портировал загрузчик .obj на target-C, и пока он работает, я могу получить свои вершины, нормали и прочее. Все нормальные, хорошие, указывают в правильном направлении, все мои лица намотаны против часовой стрелки, но у меня есть некоторые проблемы с тестом глубины.

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.

Вы найдете изображение здесь: 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, ничего не работает ...

Спасибо ^^

Ответы [ 4 ]

14 голосов
/ 07 июня 2009

что вы получите, когда добавите это в свой метод рисования?

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

Еще несколько вещей, чтобы попробовать:

  • убедитесь, что initWithFrame вызывается
  • если вы используете подкласс NSOpenGLView от IB, установите буфер глубины в IB и переместите всю вашу инициализацию openGL в - (void)prepareOpenGL
8 голосов
/ 17 февраля 2010

В случае, если кто-то задается вопросом, как установить это без IB:

NSOpenGLPixelFormatAttribute attrs[] = {
    // NSOpenGLPFADoubleBuffer,
    NSOpenGLPFADepthSize, 32,
    0
};
NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
NSOpenGLView *view = [[NSOpenGLView alloc] initWithFrame:frame pixelFormat:format];
1 голос
/ 07 июня 2009

Убедитесь, что вы вызываете glDepthFunc(), чтобы установить функцию сравнения буфера глубины. Большинство приложений используют GL_LEQUAL или GL_LESS для функции глубины. Также убедитесь, что вы вызываете glClearDepth(), чтобы установить значение, до которого очищается буфер глубины; Вам, вероятно, следует использовать параметр 1.0, чтобы очистить его до максимальной глубины.

0 голосов
/ 07 июня 2009

Я не уверен, как должны выглядеть соответствующие вызовы AGL, но вы должны убедиться, что вы фактически выделяете битовые плоскости для буфера глубины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...