2012-02-02 10 views
5

मैंने सफलतापूर्वक एक बहु-बनावट बहुभुज खींचा है लेकिन दुर्भाग्य से ओवरलेइंग बनावट का पहला पिक्सेल पूरे बनावट क्षेत्र में उपयोग किया जा रहा है।ओपनजीएल, जीएलएमओयूडलेट और मल्टीटेक्चरिंग

iconoverlay

परिणाम यह है::

result

केवल शीर्ष पर लाल पिक्सेल किया जा रहा है

यहाँ बनावट (GL_TEXTURE0 और GL_TEXTURE1) कर रहे हैं। मैंने शीर्ष पर केवल 1x1 नीली पिक्सेल के साथ प्रयास किया है और मुझे नीली ओवरले के साथ एक ही परिणाम मिलता है।

मेरे कोड:

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

const CGPoint vertices[] = { 
    ccp(0,0), 
    ccp(100,0), 
    ccp(0,100), 
    ccp(100,100), 
}; 

// This will flip the image for us as well 
const CGPoint coordinates[] = { 
    ccp(0,1), 
    ccp(1,1), 
    ccp(0,0), 
    ccp(1,0), 
}; 

// Config multitextures 
glClientActiveTexture(GL_TEXTURE0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, icon.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
glEnable(GL_TEXTURE_2D); 

glClientActiveTexture(GL_TEXTURE1); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, overlay.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
glEnable(GL_TEXTURE_2D); 

GLubyte points = 4; 

// Draw the square 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, points); 

// Revert back 
glActiveTexture(GL_TEXTURE1); 
glDisable(GL_TEXTURE_2D); 

// glClientActiveTexture(GL_TEXTURE0); // breaks multitexturing 
glActiveTexture(GL_TEXTURE0); 
glEnable(GL_TEXTURE_2D); 

glEnableClientState(GL_COLOR_ARRAY); 

यह एक ओपन समस्या है, लेकिन आईओएस परियोजना उन दिलचस्पी के लिए यहाँ उपलब्ध है: http://dl.dropbox.com/u/33811812/cocos2d/OpenGLTest.zip

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

यदि आप multitexturing हैं और आप glTexCoord *() का उपयोग करते हैं, तो आप बनावट बना रहे हैं पहली बनावट इकाई के लिए rdinates। दूसरे शब्दों में, कैसे निर्देशांक की एक सरणी पारित करने के लिए के रूप में उपयोग करते हुए glTexCoord *() glMultiTexCoord * का उपयोग कर के बराबर है (GL_TEXTURE0, ...)

किसी भी संकेत? ओपनजीएल ईएस 1.1 ग्लोबजिन() इत्यादि का समर्थन नहीं करता है

+2

ऐसा लगता है आप के लिए [glClientActiveTexture] (http://www.opengl.org/sdk/docs/man/xhtml/glClientActiveTexture.xml) देख रहे हैं। –

+0

शानदार! काम करता है, उस सेटिंग को छोड़कर 'glClientActiveTexture (GL_TEXTURE0);' ड्राइंग के बाद यह फिर से विफल हो जाता है। मेरे पास अन्य ड्रॉ विधियां हैं जिन्हें मुझे राज्यों को वापस करने की आवश्यकता है। यह कैसे हासिल किया जा सकता है? –

+0

मैंने 'glVertexAttribPointer' को भी देखा है लेकिन मुझे कोई संकेत नहीं है कि GL_TEXTURE1 के लिए निर्देशांक निर्दिष्ट करने के लिए इसका उपयोग कैसे करें ... –

उत्तर

6

अंत में!

  • उपयोग glClientActiveTexture (GL_TEXTURE *) 0 और 1 के लिए भी
  • रिवर्ट वापस glClientActiveTexture करने के लिए प्रत्येक बनावट के लिए glTexCoordPointer
  • उपयोग glEnableClientState (GL_TEXTURE_COORD_ARRAY) से पहले: समाधान है कि मैं तीन बातें करना पड़ा था (GL_TEXTURE0) परस्पर विरोधी से बचने के लिए आगे के साथ

ड्रॉ यहाँ कोड है कि काम करता है:

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

const CGPoint vertices[] = { 
    ccp(0,0), 
    ccp(100,0), 
    ccp(0,100), 
    ccp(100,100), 
}; 

// This will flip the image for us as well 
const CGPoint coordinates[] = { 
    ccp(0,1), 
    ccp(1,1), 
    ccp(0,0), 
    ccp(1,0), 
}; 

// Config multitextures 
glClientActiveTexture(GL_TEXTURE0); 
glActiveTexture(GL_TEXTURE0); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, icon.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
glEnable(GL_TEXTURE_2D); 

glClientActiveTexture(GL_TEXTURE1); 
glActiveTexture(GL_TEXTURE1); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, overlay.name); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates); 
glEnable(GL_TEXTURE_2D); 

GLubyte points = 4; 

// Draw the square 
glVertexPointer(2, GL_FLOAT, 0, vertices); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, points); 

// Revert back 
glActiveTexture(GL_TEXTURE1); 
glDisable(GL_TEXTURE_2D); 

glClientActiveTexture(GL_TEXTURE0); 
glActiveTexture(GL_TEXTURE0); 
glEnable(GL_TEXTURE_2D); 

glEnableClientState(GL_COLOR_ARRAY); 
,210

और परिणाम:

works

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