2010-07-02 21 views
7

मुझे एक 2 पीएनजी छवियां मिलीं, जिन्हें क्यूटी/सी ++ 2 डी ओपनजीएल एप्लिकेशन में बनावट के रूप में इस्तेमाल किया जा रहा था। पहले का उपयोग किसी प्रकार के "मध्यम" ग्राउंड के रूप में किया जाता है और दूसरा "ऑब्जेक्ट" के रूप में "ऑब्जेक्ट" के रूप में उपयोग किया जाता है (नोट: वे सभी एक ही जेड-वैल्यू एटीएम होते हैं, मुझे वांछित व्यवहार इसे एक में प्रस्तुत किया जाता है परिभाषित आदेश)। "ऑब्जेक्ट" -टेक्चर आंशिक रूप से पारदर्शी है। "मिडलग्राउंड" बनावट ज्यादातर ठोस है। समस्या यह है कि, मेरे "ऑब्जेक्ट" बनावट का पारदर्शी भाग ठोस पृष्ठभूमि रंग करता है, न कि "मिडलग्राउंड" बनावट।अन्य बनावट पर ओपनजीएल पारदर्शी बनावट

कोई सुझाव यह कैसे प्राप्त करें?

के बाद ओपन falgs मेरी बनावट प्रतिपादन

glEnable (GL_TEXTURE_2D); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

किसी भी मदद के लिए धन्यवाद के लिए उपयोग किया जाता है।

संपादित करें:

अधिक कोड:

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 

glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 

glEnable(GL_ALPHA_TEST); 
glAlphaFunc(GL_GREATER, 0.1f); 

glEnable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glBindTexture(GL_TEXTURE_2D, c->_texture); 

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 

glBegin(GL_QUADS); 
{ 
    glTexCoord2i(0,0); 
    glVertex2i(-128,-128); 

    glTexCoord2i(0,1); 
    glVertex2i(-128,128); 

    glTexCoord2i(1,1); 
    glVertex2i(128,128); 

    glTexCoord2i(1,0); 
    glVertex2i(128,-128); 

} 
glEnd(); 

glDisable(GL_TEXTURE_2D); 

glDisable(GL_ALPHA_TEST); 
glDisable(GL_DEPTH_TEST); 

संपादित करें: मैं अपने बनावट कैसे लोड और जहाँ तक मैं कह सकता हूँ कि यह लोड करता है अल्फ़ा चैनल

QImage img("./images/dummycar.png","PNG"); 
QImage t(QGLWidget::convertToGLFormat(img)); 
glGenTextures(1, &_texture); 
glBindTexture(GL_TEXTURE_2D, _texture); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

स्क्रीनशॉट के साथ : http://img824.imageshack.us/img824/1912/blackbox.png

द स्काईमेज "मिडलग्राउंड" पृष्ठभूमि ठोस काला है।

+0

स्पष्टीकरण के साथ स्क्रीनशॉट अच्छा होगा। – SigTerm

उत्तर

7
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 

आप internalFormat के लिए 3 चैनलों को निर्दिष्ट कर रहे हैं, ताकि आरजीबी, नहीं RGBA है। इसके बजाय उस स्थिति में GL_RGBA का उपयोग करने का प्रयास करें।

+1

जैसा कि मुझे पता था कि यह कुछ बेवकूफ था। बहुत बहुत धन्यवाद, जिसने मेरा दिन बचाया :) – drahnr

4

क्या आपने glAlphaFunc के साथ झुकाव करने की कोशिश की है? आप अल्फा मूल्य के आधार पर अपने ऑब्जेक्ट बनावट के पारदर्शी हिस्सों को चित्रित करने के लिए इसका उपयोग कर सकते हैं।

के बारे में क्या या तो

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

या

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)?

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

यह काम नहीं किया। मैंने glEnable (GL_ALPHA_TEST) की कोशिश की; glAlphaFunc (GL_GREATER, 0.1 एफ); लेकिन कोई बदलाव नहीं। GL_MODULATE ने कुछ भी नहीं बदला, GL_BLEND ने रंग बदल दिया, लेकिन मेरे ऑब्जेक्ट के आस-पास "बॉक्स" अभी भी – drahnr

+1

था यह वास्तव में मेरे लिए उपयोगी था। बीबी का उपयोग करते हुए, जब मैंने अल्फा परीक्षण सक्षम किया और GL_GREATER का उपयोग किया, तो यह एक आकर्षण की तरह काम करता था। – bobobobo

3

यदि आप प्रति ऑब्जेक्ट एक बनावट प्रतिपादित कर रहे हैं, तो आपको glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE) का उपयोग करने की आवश्यकता है।

यदि बनावट के बाद भी इसके आसपास बनावट "बॉक्स" है, तो इसे अल्फा चैनल के बिना लोड किया गया था।

यह पूरी तरह से मेरे लिए काम करता है:

glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glBindTexture(GL_TEXTURE_2D, texture2->tex); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glColor4f(0.5f, 1.0f, 0.5f, 0.5f); 
    glBegin(GL_TRIANGLE_FAN); 
    glTexCoord2f(0, 0); 
    glVertex2f(x, y); 
    glTexCoord2f(1, 0); 
    glVertex2f(x + texture2->width, y); 
    glTexCoord2f(1, 1); 
    glVertex2f(x + texture2->width, y+ texture2->height); 
    glTexCoord2f(0, 1); 
    glVertex2f(x, y + texture2->height); 
    glEnd(); 
    glDisable(GL_BLEND); 

अर्ध-पारदर्शी बनावट, पिछले रंग से रंगा हुआ।

यदि "बनावट के चारों ओर एक बॉक्स रखना" आपकी समस्या का वर्णन नहीं करता है, तो आपको स्क्रीनशॉट पोस्ट करने की आवश्यकता है।

--EDIT--

अपडेट किया गया डेटा your screenshot पर आधारित है।

आपको पहले पृष्ठभूमि प्रस्तुत करना होगा, और फिर कार प्रस्तुत करना होगा। आप पृष्ठभूमि रंग देखते हैं क्योंकि सतह पारदर्शी होने पर भी, यह मानों के साथ जेड-बफर भरती है, और चूंकि पृष्ठभूमि कार से नीचे है, इसलिए यह अदृश्य हो जाती है।

जब आप अर्द्ध पारदर्शी वस्तुओं को प्रस्तुत कर रहे हैं, तो आपको उन नियमों का पालन करना होगा।

  1. अर्ध-पारदर्शी वस्तुओं से पहले सभी गैर पारदर्शी वस्तुओं को प्रस्तुत किया जाना चाहिए। हमेशा।

  2. सभी पारदर्शी वस्तुओं को पीछे की ओर वस्तु में प्रस्तुत किया जाना चाहिए। सबसे दूर वस्तुओं को पहले प्रस्तुत किया जाना चाहिए, निकटतम वस्तुओं को दूसरे स्थानांतरित किया जाना चाहिए।

  3. यदि बैक-टू-फ्रंट ऑर्डर में प्रतिपादन संभव नहीं है (GL_ADD मिश्रण के साथ छोड़े गए कण), गहराई बफर में लिखना glDepthMask (GL_FALSE) का उपयोग करके अक्षम किया जाना चाहिए। यदि आप ऐसा नहीं करते हैं, तो आप बदसूरत कलाकृतियों पाएंगे। (आपके स्क्रीनशॉट पर एक की तरह)।

+0

क्या यह अंतर्निहित बनावट दिखाता है? अब तक यह मेरे लिए भी काम करता है, लेकिन मेरी समस्या यह है कि मैं एक और बनावट वस्तु _beyond_ देखना चाहता हूं जिसे मैं आकर्षित करता हूं। लेकिन एटीएम मुझे इसके बजाय पृष्ठभूमि रंग मिलता है (काला)। स्क्रीनशॉट: http://img824.imageshack.us/img824/1912/blackbox.png – drahnr

+0

@ soxs060389: मैंने अपना जवाब अपडेट कर लिया है। आपको पहले जमीन प्रस्तुत करना चाहिए, और उसके बाद कार प्रस्तुत करना चाहिए। अगर आप इसे रिवर्स ऑर्डर में करते हैं तो यह काम नहीं करेगा। – SigTerm

+0

मैं घंटे zer0 के बाद से ऐसा कर रहा था। गाड़ी हमेशा प्रस्तुत की जाने वाली आखिरी वस्तु थी। – drahnr

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