2010-06-29 20 views
7

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

gl.glEnable(GL10.GL_STENCIL_TEST); 
gl.glClearStencil(0); 
gl.glClear(GL10.GL_STENCIL_BUFFER_BIT); 
gl.glColorMask(false, false, false, false); 
gl.glDepthMask(false); 
gl.glStencilFunc(GL10.GL_ALWAYS, 1, 1); 
gl.glStencilOp(GL10.GL_REPLACE, GL10.GL_REPLACE, GL10.GL_REPLACE); 

drawMask(); //I have confirmed this draws to the correct location by allowing colour to show. Trust that this draws the mask to the correct location. 

gl.glColorMask(true, true, true, true); 
gl.glDepthMask(true); 
gl.glStencilFunc(GL10.GL_EQUAL, 1, 1); 
gl.glStencilOp(GL10.GL_KEEP, GL10.GL_KEEP, GL10.GL_KEEP); 

drawItems(); //Draw everything. Only items inside the masked area should be drawn. But everything is drawn with this code... 

gl.glDisable(GL10.GL_STENCIL_TEST); 

कोई भी इस के साथ कुछ गलत खोजता है? मूल रूप से यह कहने के लिए एक बॉक्स खींचता है, आधे स्क्रीन (यह काम करता है अगर मेरे पास रंग सक्षम था) जो उस क्षेत्र के लिए स्टैंसिल बफर को 1 पर सेट कर रहा है। और अंत में मैं पूरी स्क्रीन पर आकर्षित करता हूं। मैं इसे केवल शीर्ष छमाही में आकर्षित करना चाहता हूं, लेकिन यह सब कुछ खींचता है।

अग्रिम धन्यवाद।

+2

अपने संदर्भ विन्यास [किसी भी स्टेंसिल बफर बिट्स है] क्या (http://www.mail-archive.com/[email protected]/msg21180.html)? – genpfault

+0

यह नहीं करता है। धन्यवाद, मैंने सोचा कि यह एक आवश्यक opengl सुविधा थी। ऐसा लगता है कि यह नहीं है। – Moncader

उत्तर

4

कारण यह हुआ कि मैंने स्टैंसिल बफर का समर्थन करने के लिए अपना ईजीएलकोनफिग ठीक से सेट नहीं किया था।

+8

अधिक जानकारी अच्छी होगी –

5

आपको setEGLConfigChooser का उपयोग करके स्टैंसिल आकार सेट करना होगा। ध्यान दें कि विभिन्न फोनों में अलग-अलग सतहें होती हैं जो इसका समर्थन कर सकती हैं या नहीं।

उदाहरण के लिए:

// void android.opengl.GLSurfaceView.setEGLConfigChooser(int redSize, int greenSize, int blueSize, int alphaSize, int depthSize, int stencilSize) 
    mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 8); 
+0

अजीब। मैंने पहले इस जवाब को क्यों नहीं देखा? वैसे भी, मेरे पास बिल्कुल वही प्रश्न था, और मैंने लगभग उसी तरह उत्तर दिया :-) – hirschhornsalz

2

आप स्पष्ट रूप से GLSurfaceView.setEGLConfigChooser साथ स्टेंसिल बफर अनुरोध करने की आवश्यकता:

public class MyActivity extends Activity { 
    GLSurfaceView view; 
    ... 
    onCreate(... 
     view.setEGLConfigChooser(5,6,5,0,16,8); 
     view.setRenderer(... 

संख्या लाल, हरा, नीला कर रहे हैं, अल्फा, गहराई, स्टेंसिल बिट्स। 16 बिट गहराई और 8 बिट स्टैंसिल के साथ आरजीबी 565 न्यूनतम है जो प्रत्येक ईजीएल सक्षम एंड्रॉइड डिवाइस द्वारा समर्थित है।

+0

+1 वे बफर प्रस्तुत करने के लिए न्यूनतम समर्थित बिट गहराई हैं लेकिन क्या आपको कोई दस्तावेज मिला है जो कहता है कि ये भी न्यूनतम गहराई हैं खिड़की की सतहें? –

0

यह उत्तर नीचे दिखाए गए लिंक से दोबारा पोस्ट किया गया है। यह मेरे लिए नमूने में एक ओपनजीएल ES2.0 बग तय किया गया।

"यह स्टेंसिल बुला glClear (GL_STENCIL_BUFFER_BIT) स्टेंसिल बफर के सभी बिट्स स्पष्ट करने से पहले मुखौटा glStencilMask (0xff) स्थापित करने के लिए आवश्यक है।"

android opengl 2.0 stencil buffer not working

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