- सावधान सक्षम करने से रंग सामग्री
ओपन के रंग सामग्री सुविधा परिवर्तन सामग्री मानकों करने के लिए एक कम खर्चीला तरीका प्रदान करता है। रंग सामग्री सक्षम के साथ, सामग्री रंग वर्तमान रंग को ट्रैक करते हैं। इसका मतलब है कि अपेक्षाकृत महंगा 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
को सक्षम करने के लिए हमेशा सावधान रहें।
अच्छा संबंधित लिंक https://sjbaker.org/steve/omniv/opengl_lighting.html –