2011-12-13 15 views
24

मैं ओपनजीएल एपीआई और जीएलयूटी के साथ सी ++ में ग्राफिक्स एप्लिकेशन विकसित कर रहा हूं।जब मैं ओपनजीएल में प्रकाश सक्षम करता हूं तो मेरा रंग क्यों दूर जाता है?

प्रकाश जोड़ने के लिए, मैं अपने modelview मैट्रिक्स में निम्न परिवर्तन किए:

glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 

// Create light components. 
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f }; 
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f }; 
GLfloat position[] = { 0.0f, 0.0f, 0.0f, 1.0f }; 

// Assign created components to GL_LIGHT0. 
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); 
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight); 
glLightfv(GL_LIGHT0, GL_POSITION, position); 

प्रकाश काफी हद तक काम करता है मुझे विश्वास है, लेकिन मेरी वस्तुओं के रंग सब चले जाओ। मैं देखता हूं कि मेरे समग्र आंकड़े का एक काला/सफेद सिल्हूट है।

मैं सोच रहा था कि यह क्यों है?

+1

अच्छा संबंधित लिंक https://sjbaker.org/steve/omniv/opengl_lighting.html –

उत्तर

29

जब प्रकाश सक्षम किया गया है, एक शीर्ष 'रंग रंग glColor या glColorPointer द्वारा निर्धारित से निर्धारित नहीं है, लेकिन सामग्री रोशनी के साथ संयुक्त रंग वर्तमान में सेट से' प्रकाश संगणना का उपयोग कर रंग।

तो किसी ऑब्जेक्ट के रंग को बदलने के लिए, आपको glMaterial फ़ंक्शंस का उपयोग करके प्रतिपादन से पहले सामग्री सेटिंग (जिसे डिफ़ॉल्ट रूप से एक फैलाने वाली ग्रे सामग्री है) को बदलने की आवश्यकता है। प्रकाश उत्सर्जक सामग्री (GL_EMISSION) का अनुमान लगाने और सामग्री की खुरदरापन को नियंत्रित करने के लिए कुछ अतिरिक्त गुणों के साथ-साथ प्रत्येक अलग-अलग प्रकाश रंगों (GL_DIFFUSE, ...) के लिए अनिवार्य रूप से एक संबंधित सामग्री रंग होता है (GL_SHININESS)। ओपनजीएल की प्रकाश सुविधाओं पर उनके प्रारंभिक कार्यों को समझने के लिए कुछ प्रारंभिक सामग्री पढ़ें।

सादा रंग से लेकर प्रकाश (या प्रति-वर्टेक्स सामग्री गुणों को सक्षम करने के लिए) से अपने कोड को तेज़ी से अनुकूलित करने के लिए आप क्या कर सकते हैं रंग सामग्री का उपयोग करना है। glEnable(GL_COLOR_MATERIAL) पर कॉल करके और glColorMaterial के साथ उचित मैपिंग सेट करके आप ओपनजीएल को एक विशिष्ट सामग्री रंग बदलने के लिए कॉन्फ़िगर कर सकते हैं, जब भी आप वर्तमान वर्टेक्स रंग बदलते हैं (glColor या glColorPointer का उपयोग करके)।

+0

धन्यवाद! उसने ऐसा किया – dangerChihuahua007

19

glEnable(GL_COLOR_MATERIAL) आज़माएं।

Common OpenGL Pitfall #14 देखें:

  1. सावधान सक्षम करने से रंग सामग्री

ओपन के रंग सामग्री सुविधा परिवर्तन सामग्री मानकों करने के लिए एक कम खर्चीला तरीका प्रदान करता है। रंग सामग्री सक्षम के साथ, सामग्री रंग वर्तमान रंग को ट्रैक करते हैं। इसका मतलब है कि अपेक्षाकृत महंगा glMaterialfv दिनचर्या का उपयोग करने के बजाय, आप glColor3f दिनचर्या का उपयोग कर सकते हैं।

glColorMaterial(GL_FRONT, GL_DIFFUSE); 
glEnable(GL_COLOR_MATERIAL); 
glBegin(GL_TRIANGLES); 
    glColor3f(0.2, 0.5, 0.8); 
    glVertex3f(1.0, 0.0, 0.0); 
    glColor3f(0.3, 0.5, 0.6); 
    glVertex3f(0.0, 0.0, 0.0); 
    glColor3f(0.4, 0.2, 0.2); 
    glVertex3f(1.0, 1.0, 0.0); 
glEnd(); 

पर विचार करें और अधिक महंगा कोड अनुक्रम अगर glMaterialfv की जरूरत है स्पष्ट रूप से प्रयोग किया है::

यहाँ रंग सामग्री सुविधा का उपयोग कर एक त्रिकोण में से प्रत्येक के शिखर के लिए फैलाना रंग बदलने के लिए एक उदाहरण है

GLfloat d1[] = { 0.2, 0.5, 0.8, 1.0 }; 
GLfloat d2[] = { 0.3, 0.5, 0.6, 1.0 }; 
GLfloat d3[] = { 0.4, 0.2, 0.2, 1.0 }; 

glBegin(GL_TRIANGLES); 
    glMaterialfv(GL_FRONT,GL_DIFFUSE,d1); 
    glVertex3f(1.0, 0.0, 0.0); 
    glMaterialfv(GL_FRONT,GL_DIFFUSE,d2); 
    glVertex3f(0.0, 0.0, 0.0); 
    glMaterialfv(GL_FRONT,GL_DIFFUSE,d3); 
    glVertex3f(1.0, 1.0, 0.0); 
glEnd(); 

यदि आप ऐसी वस्तुओं को प्रतिपादित कर रहे हैं जिन्हें लगातार सरल सामग्री परिवर्तनों की आवश्यकता होती है, तो रंग सामग्री मोड का उपयोग करने का प्रयास करें। हालांकि, कलर सामग्री मोड को सक्षम करते समय सामान्य पिटफॉल आया है। जब रंग सामग्री सक्षम है, तो OpenGL रंग सामग्री स्थिति द्वारा नियंत्रित सामग्री रंगों को तुरंत बदल देता है। कोड की निम्न टुकड़ा पर विचार करें एक नव बनाने ओपन प्रतिपादन संदर्भ प्रारंभ करने में:

GLfloat a[] = { 0.1, 0.1, 0.1, 1.0 }; 
glColor4f(1.0, 1.0, 1.0, 1.0); 

glMaterialfv(GL_FRONT, GL_AMBIENT, a); 
glEnable(GL_COLOR_MATERIAL); /* WARNING: Ambient and diffuse material latch immediately to the current color. */ 
glColorMaterial(GL_FRONT, GL_DIFFUSE); 
glColor3f(0.3, 0.5, 0.6); 

क्या राज्य सामने परिवेश और फैलाना सामग्री रंग ऊपर कोड टुकड़ा को क्रियान्वित करने के बाद क्या होगा? जबकि प्रोग्रामर के पास हो सकता है जिसका उद्देश्य परिवेश सामग्री राज्य (0.1, 0.1, 0.1, 1.0) और प्रसारित सामग्री स्थिति (0.3, 0.5, 0.6, 1.0) हो, जो बहुत कुछ नहीं होता है।

परिणामी प्रसारित सामग्री राज्य प्रोग्रामर का इरादा है, लेकिन परिणामस्वरूप परिवेश सामग्री स्थिति अप्रत्याशित रूप से (1.0, 1.0, 1.0, 1.0) है। यह कैसे हुआ? खैर, याद रखें कि रंग सामग्री मोड तुरंत सक्षम होने पर वर्तमान रंग को ट्रैक करना शुरू कर देता है। रंग सामग्री सेटिंग्स के लिए प्रारंभिक मान GL_FRONT_AND_BACK और GL_AMBIENT_AND_DIFFUSE (शायद आपको अपेक्षित नहीं है!)।

चूंकि रंग सामग्री मोड सक्षम करने से तुरंत वर्तमान रंग पर नज़र रखने के लिए शुरू होता है, दोनों परिवेश और फैलाना सामग्री राज्यों (1.0, 1.0, 1.0, 1.0) के रूप में अपडेट कर रहे हैं। ध्यान दें कि प्रारंभिक glMaterialfv का प्रभाव खो गया है। इसके बाद, रंग सामग्री स्थिति केवल सामने फैलाने वाली सामग्री को बदलने के लिए अपडेट की गई है। अंत में, glColor3f आमंत्रण प्रसारित सामग्री को (0.3, 0.5, 0.6, 1.0) में बदल देता है। परिवेश सामग्री राज्य (1.0, 1.0, 1.0, 1.0) होने पर समाप्त होता है।

उपरोक्त कोड खंड में समस्या यह है कि रंग सामग्री मोड glColorMaterial पर कॉल करने से पहले सक्षम है। रंग सामग्री मोड कुशल सरल सामग्री परिवर्तनों के लिए बहुत प्रभावी है, लेकिन उपरोक्त pitfall से बचने के लिए, glColorMaterial से पहले GL_COLOR_MATERIAL को सक्षम करने के लिए हमेशा सावधान रहें।

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

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