2009-06-06 9 views
10

मैंने अभी तक एक .obj लोडर को उद्देश्य-सी पर पोर्ट किया है और अब तक, यह काम करता है, मैं अपने शिखर और मानक और सामान प्राप्त कर सकता हूं। प्रत्येक सामान्य अच्छा है, सही दिशा में इशारा करते हुए, मेरे सभी चेहरे सीसीडब्ल्यू घुमाव में हैं, लेकिन मुझे गहराई परीक्षण के साथ कुछ समस्याएं हैं।ओपनजीएल 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

मैं काफी ओपन और उद्देश्य सी के लिए नया है, इसलिए मुझे लगता है कि मेरी समस्या एक सेटिंग है कि मैं भूल गया से आता है। यहां वे हैं:

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

कुछ और बातें करने की कोशिश करना:

  • सुनिश्चित करें initWithFrame
  • बुलाया जा रहा है आप आईबी से एक NSOpenGLView उपवर्ग उपयोग कर रहे हैं, आईबी में गहराई बफर निर्धारित करते हैं, और सभी के लिए कदम - (void)prepareOpenGL
+0

इसे drawRect फ़ंक्शन में जोड़ा गया, "0 बिट गहराई" देता है। सही नहीं लगता ... – melka

+0

तो आपकी समस्या है। – shoosh

+2

वाह, धन्यवाद, यह काम किया। मुझे नहीं पता था कि आपको आईबी में पैरा सेट करना होगा। अब मेरे पास 24 बिट्स गहराई है और मेरे दृश्य में कोई और समस्या नहीं है ^^ – melka

0

मुझे यकीन है कि कैसे उचित एजीएल कॉल की तरह दिखना चाहिए नहीं कर रहा हूँ, लेकिन आप यकीन है कि आप वास्तव में आवंटित करना चाहिए गहराई बफर के लिए बिट विमान।

1

सुनिश्चित करें कि आप गहराई बफर तुलना फ़ंक्शन सेट करने के लिए glDepthFunc() पर कॉल करें। अधिकांश अनुप्रयोग गहराई के फ़ंक्शन के लिए GL_LEQUAL या GL_LESS का उपयोग करते हैं। यह भी सुनिश्चित करें कि गहराई बफर को साफ़ करने वाले मान को सेट करने के लिए आप glClearDepth() पर कॉल करें; अधिकतम गहराई को साफ़ करने के लिए आपको शायद 1.0 के पैरामीटर का उपयोग करना चाहिए।

+0

मैंने अभी कोशिश की है, gldepthFunc के लिए अन्य पैरामीटर के साथ, कुछ नया नहीं ...:/ – melka

8

में अपने ओपन प्रारंभ मामला किसी में चमत्कार कैसे आईबी के बिना इस सेट करने के लिए:

+०१२३५१६४१०६१
NSOpenGLPixelFormatAttribute attrs[] = { 
    // NSOpenGLPFADoubleBuffer, 
    NSOpenGLPFADepthSize, 32, 
    0 
}; 
NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; 
NSOpenGLView *view = [[NSOpenGLView alloc] initWithFrame:frame pixelFormat:format]; 
संबंधित मुद्दे