2009-06-06 22 views
10

私はObject-Cに.objローダーを移植しました。これまでのところ、私は頂点と法線とを得ることができます。 すべてのノーマルは正しいですが、正しい方向を指しています。私の顔はすべてCCWワインディングですが、デプステストに問題があります。 OpenGL GL_DEPTH_TESTが動作しません

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

をI 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の組み合わせ、何も動作...

感謝^^

答えて

14

これを描画メ​​ソッドに追加するとどうなりますか?

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

しようとするいくつかのより多くの事:

  • あなたはIBからNSOpenGLViewサブクラスを使用している場合は、IBに深度バッファを設定initWithFrameが
  • と呼ばれていることを確認し、すべての移動ケース誰かに- (void)prepareOpenGL
+0

drawRect関数に追加され、「0ビット深度」を返します。正しいとは思わない... – melka

+0

あなたの問題がある。 – shoosh

+2

うわー、ありがとう、それは働いた。 IBでパラメータを設定する必要があるかどうかわかりませんでした。 今、私は24ビットの深さを持っています。私の見解ではこれ以上の問題はありません^^ – melka

0

私は適切なAGLはのようになります呼び出すかどうかはわかりませんが、あなたは、あなたが実際に割り当てを確認する必要があります深度バッファのためのビットプレーン。

1

深度バッファ比較機能を設定するには、glDepthFunc()に電話してください。ほとんどのアプリケーションでは、深さ関数にGL_LEQUALまたはGL_LESSを使用しています。 glClearDepth()に電話して、デプスバッファがクリアされる値を設定するようにしてください。最大深度までクリアするには、おそらく1.0というパラメータを使用するべきです。

+0

glDepthFuncの他のパラメータを使用してみましたが、これは何も新しいものではありません:/ – melka

8

にあなたのOpenGLの初期化はIBせずにこれを設定する方法を不思議:

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