2012-01-29 8 views
5

मै मैक ओएस एक्स 10.5 और उच्चतर के लिए ओपनजीएल स्क्रीनसेवर लिखा है जो मार्चिंग क्यूब्स का उपयोग करके निर्मित कताई दिल दिखाता है। यह मेरा काला 13.3 "विकास मैकबुक चल हिम तेंदुए (10.6), अच्छा और चमकदार पर ठीक काम करता है।ओपनजीएल ऑब्जेक्ट मैक ओएस एक्स 10.6 में चमकदार/चमकदार, लेकिन 10.5 नहीं। क्यूं कर?

लेकिन जब मैं एक नए मैकबुक प्रो लेकिन चल तेंदुए (10.5), दिल प्रतिसाद नहीं पर यह कोशिश यह चमकदार नहीं है। ऐसा प्रतीत होता है कि यह केवल परिवेश/फैलाने वाली रोशनी के साथ जलाया गया है, लेकिन कोई विशिष्ट प्रकाश नहीं है। ऐसा लगता है कि मैंने प्रकाश के specular घटक को 0 पर सेट किया था। नई मैकबुक में एक एनवीडिया ग्राफिक्स कार्ड है। एक पुराना 10.6 एक इंटेल XMA3100 उसकी चल गया है।

ई मेरा ओपनजीएल प्रारंभिक कोड है। हृदय मार्चिंग क्यूब्स का उपयोग करके बनाया गया है और मैं सामान्य वैक्टरों की गणना भी कर रहा हूं।

 
- (void)setUpOpenGL 
{ 
    [[glView openGLContext] makeCurrentContext]; 

    // Synchronize buffer swaps with vertical refresh rate 
    GLint swapInterval = 1; 
    [[glView openGLContext] setValues:&swapInterval 
         forParameter:NSOpenGLCPSwapInterval]; 

    glShadeModel(GL_SMOOTH); 
    glClearDepth(1.0); 
    glClearColor (0.0, 0.0, 0.0, 0.0); 
    glEnable(GL_DEPTH_TEST); 

    // Light 
    GLfloat ambient_light[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
    GLfloat diffuse_light[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    GLfloat specular_light[] = { 1.0f, 1.0f, 1.0f, 1.0f }; 
    GLfloat position_light[] = { 0.0f, 0.0f, -1.0f, 0.0f }; 

    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHTING); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_light); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_light); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, specular_light); 
    glLightfv(GL_LIGHT0, GL_POSITION, position_light); 

    // Material 
    glEnable(GL_COLOR_MATERIAL); 
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); 

    GLfloat mat_ambient[] = {0.7, 0.0, 0.0, 1.0}; 
    GLfloat mat_diffuse[] = { 0.7, 0.0, 0.0, 1.0 }; 
    GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 0.0 }; 
    GLfloat mat_shininess[] = { 100.0 }; 

    glColor3f(1.0, 0.0, 0.0); 

    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 

    // Copy isosurface vertices to graphics array 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glVertexPointer(3, GL_FLOAT, 0, [marchingCubes vertices]); 
    glNormalPointer(GL_FLOAT, 0, [marchingCubes normals]); 
} 

वास्तविक ड्राइंग कोड इस तरह दिखता है:

 
- (void)drawRect:(NSRect)rect 
{ 
    [super drawRect:rect]; 

    [[glView openGLContext] makeCurrentContext]; 

    glDrawBuffer(GL_BACK); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Adjust viewpoint to give heart beat effect 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0, radius, 2*radius/3, 
       0, 0, 0, 
       0, 0, 1); 

    // Adjust rotation to make heart spin 
    glRotatef(rotation, 0.0f, 0.0f, 1.0f); 

    // Draw heart 
    glDrawArrays(GL_TRIANGLES, 0, [marchingCubes vertexCount]/3); 

    glFlush(); 

    [[glView openGLContext] flushBuffer]; 

    // Rotate and scale a bit 
    rotation += 1.0f; 
    radius = 4.0 + 0.25*sin(rotation/4); 
} 
कोई भी विचार

क्यों specular प्रकाश अंतर है? क्या कुछ ग्राफिक्स कार्ड पर specular प्रकाश बस समर्थित नहीं है? किसी भी पॉइंटर्स की बहुत सराहना की जाती है।

+0

कभी यह पता नहीं लगा लेकिन परियोजना को सोर्स किया गया: https://github.com/thinkski/ValentineGL –

उत्तर

1

GL_SPECULAR (और अन्य रंग) के लिए डिफ़ॉल्ट { 0.0,0.0,0.0,1.0 }

GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 1.0 }; 

तुम भी करने के लिए 1. अनुकूलन ड्राइंग और 2. दोहरी जांच करने के लिए अपने स्थापना समारोह के अंत में ऐसा कर सकते हैं अगर प्रकाश वास्तव में लागू किया जाता है जब आप इसे सेट करते हैं तो सामने के चेहरे पर।

glCullFace(GL_BACK); 
glEnable(GL_CULL_FACE); 
+0

सुझाव के लिए धन्यवाद। मैंने पीछे के चेहरे पर कूलिंग जोड़ा और वास्तव में पाया कि सामने का चेहरा अंदर था। तो मैंने setUpOpenGL में "ऊर्ध्वाधर रीफ्रेश दर के साथ बफर स्वैप को सिंक्रनाइज़ करने के बाद" glfrontFace (GL_CW) पर एक कॉल जोड़ा, लेकिन अभी भी कोई चमक नहीं है। प्रकाश और सामग्री specular घटकों दोनों उपरोक्त कोड में {1.0, 1.0, 1.0, 1.0} पर सेट हैं। यदि मैं या तो {0.0, 0.0, 0.0, 1.0} पर सेट करता हूं तो चमक 10.6 पर भी जाती है। –

+0

सामग्री और हल्के रंग मिश्रित होने पर इसे गुणा के साथ करना पड़ता है। काला * अन्य रंग काला देता है, जब अल्फा भी 0.0 होता है, तो परिणाम पूरी तरह से पारदर्शी होता है, जो भी 3 रंग घटक हो सकता है। मेरा सुझाव है कि आप gllight() का उपयोग करके प्रकाश क्षीणन और अन्य मूल्यों को स्पष्ट रूप से परिभाषित करें। – Sam

+0

मैं इसे आज़मा दूंगा। मेरे पास 10.5 टेस्ट मशीन तक पहुंच नहीं है इसलिए परीक्षण धीमा हो जाएगा। एक और बात मैंने सोचा था कि 10.5 एक 32-बिट ऑपरेटिंग सिस्टम है जबकि 10.6 64-बिट है, इसलिए मैंने प्रत्येक पर एक फ़ाइल में सामान्य वैक्टर और शिखर लिखा और तुलना की। वे समान थे, इसलिए यह समस्या नहीं है। –

संबंधित मुद्दे