2010-11-15 9 views
8

मेरे पास एक वर्टेक्स शेडर है जिसमें मैं gl_Position निर्धारित करने के लिए बनावट लुकअप करता हूं। मैं इसे एक जीपीयू कण सिमुलेशन सिस्टम के हिस्से के रूप में उपयोग कर रहा हूं, जहां कण की स्थिति बनावट में संग्रहित होती है।वर्टेक्स शेडर में बनावट लुकअप आईपैड डिवाइस बनाम आईपैड सिम्युलेटर पर अलग-अलग व्यवहार करता है - ओपनजीएल ईएस 2.0

ऐसा लगता है कि: vec4 textureValue = texture2D(dataTexture, vec2(1.0, 1.0)); आईपैड डिवाइस की तुलना में सिम्युलेटर पर अलग-अलग व्यवहार करता है। सिम्युलेटर पर, बनावट लुकअप सफल होता है (उस स्थान का मान 0.5, 0.5 है) और मेरा कण वहां दिखाई देता है। हालांकि, आईपैड पर ही बनावट लुकअप लगातार 0.0, 0.0 लौट रहा है।

मैंने प्रारूप GL_FLOAT और GL_UNSIGNED_BYTE प्रारूप दोनों बनावट की कोशिश की है।

क्या किसी और ने इसका अनुभव किया है? जीएलएसएल ईएस स्पेक का कहना है कि बनावट लुकअप दोनों कशेरुक और टुकड़े के टुकड़ों में किया जा सकता है, इसलिए मुझे नहीं पता कि समस्या क्या है।

मैं आईओएस एसडीके 4.2

उत्तर

10

मैंने अभी भी इसका परीक्षण किया है। आईओएस 4.3 का उपयोग करके, आप डिवाइस और सिम्युलेटर दोनों पर वर्टेक्स शेडर पर एक बनावट लुकअप कर सकते हैं। हालांकि कुछ अजीबता है (शायद यही कारण है कि यह "आधिकारिक" नहीं है जैसा कि एसजीयू ने उल्लेख किया है)। वास्तविक डिवाइस पर (मैंने आईपैड 2 पर परीक्षण किया) आपको टुकड़े के शेडर के साथ-साथ कशेरुक शेडर पर एक लुकअप करना होगा। यही है, अगर आप वास्तव में इसे टुकड़े टुकड़े पर उपयोग नहीं कर रहे हैं, तो आपको अभी भी इसे किसी भी तरह से संदर्भित करना होगा।यहाँ एक तुच्छ उदाहरण है, जहां मैं एक बनावट में गुजर रहा हूँ और एक छोटा सा द्वारा शिखर के y मूल्य स्थिति बदलने के लिए लाल पिक्सेल का उपयोग कर रहा है:

/////fragment shader 
uniform sampler2D tex; //necessary even though not actually used 

void main() { 
    vec4 notUsed = texture2D(tex, vec2(0.0,0.0)); //necessary even though not actually used 
    gl_FragColor = vec4(1.0,1.0,1.0,1.0); 
} 

/////vertex shader 
attribute vec4 position; 
attribute vec2 texCoord; 
uniform sampler2D tex; 

void main() { 
    float offset = texture2D(tex, texCoord).x; 
    offset = (offset - 0.5) * 2.0; //map 0->1 to -1 to +1 
    float posx = position.x; 
    float posy = position.y + offset/8.0; 

    gl_Position = vec4(posx, posy, 0.0, 1.0); 
} 

मैं एक से थोड़ा संपूर्ण http://www.mat.ucsb.edu/a.forbes/blog/?p=453

पर इस बात का लेख है
+1

जो आपने पाया है वह एक बग या "खुश दुर्घटना" होना चाहिए। मेरे आईपैड पर (स्वीकार्य रूप से 4.2.1), GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0 देता है, जिसका अर्थ है कि कोई वर्टेक्स शेडर में बनावट लुकअप नहीं कर सकता है। मैं उत्सुक हूं कि आप अपने आईपैड 2 पर GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS के लिए क्या मूल्य प्राप्त करते हैं। –

+2

हाय, 4.3.4 का उपयोग करके मेरा आईपैड 2 भी GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS (और GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS और GL_MAX_TEXTURE_IMAGE_UNITS दोनों के लिए 8) के लिए 0 देता है। मेरा अनुमान है कि आईपैड 2 पर ग्राफिक्स कार्ड इसका समर्थन करता है, लेकिन किसी कारण से ड्राइवर इसे अक्षम करता है ताकि विभिन्न आईओएस उपकरणों पर समान व्यवहार हो। मैंने अभी तक आईफोन या आईपैड 1 पर यह कोशिश नहीं की है। आईओएस आईपैड 4.3 सिम्युलेटर भी GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS के लिए 0 की रिपोर्ट करता है, लेकिन आपको सामान्य रूप से वर्टेक्स शेडर से बनावट तक पहुंचने की अनुमति देता है (खंड टुकड़े में नकली बनावट लुकअप को जोड़ने के बिना)। –

+0

हू, दिलचस्प .. जितना मैं इस सुविधा का उपयोग करना चाहता हूं, मैं अपने ऐप को तोड़ने वाले हार्डवेयर के भविष्य के टुकड़े के बारे में बहुत पागल हूं यदि मेरा ऐप उस मूल्यवान मूल्य को अनदेखा करता है। :( –

1

के नवीनतम जीएम बीटा उपयोग कर रहा हूँ यह केवल एक चीज है कि डिवाइस बनाम सिम में अलग तरह से व्यवहार करती है नहीं है। मैं आपको वही सुझाव दूंगा जो मैं हर किसी को बना देता हूं: सिम्युलेटर को अनदेखा करें जब आपको यह जांचने की ज़रूरत है कि उन्हें डिवाइस पर कैसे दिखना चाहिए। केवल तर्क, कार्यक्षमता जैसी चीजों का परीक्षण करें, सिम पर न देखें, और केवल तभी आप कर सकते हैं।

+0

ठीक है, और यही वह है जो मैं कर रहा हूं; लेकिन मुझे डिवाइस पर सही व्यवहार प्राप्त करने का कोई तरीका नहीं मिल रहा है। यह एक साधारण बनावट लुकअप है, इसलिए मुझे यकीन नहीं है कि इसे ठीक करने के बारे में कैसे जाना है। – kcbanner

1

मुझे लगता है कि आईपैड (या आईफोन) पर जीएलएस एक वर्टेक्स शेडर में बनावट का समर्थन नहीं करता है, लेकिन मुझे उद्धृत न करें।

यदि यह वर्टेक्स शेडर्स में टेक्सल लुकअप का समर्थन करता है, तो शायद आपके बनावट को क्लिप या रैपिंग समन्वयित किया गया है? क्योंकि 1.0x1.0 बनावट आईआईआरसी के बाहर है।

रैपिंग मोड में 1.0x1.0 0.0x0.0 होना चाहिए। क्लिपिंग में 1.0x1.0 अंतिम टेक्स्ट होना चाहिए।

+0

ठीक है, और इस मामले में मेरा बनावट पूरी तरह से एक ही 'रंग' है। डेटा हर जगह 0.8 है। अभी भी वापसी मूल्य के रूप में 0,0 हो रही है। – kcbanner

+0

पहली चीज जो मैं करता हूं वह एक ही बनावट पर एक साधारण टुकड़ा शेडर का परीक्षण करती है और आपके कोड में यथासंभव कम से कम बदलने की कोशिश करती है। यदि यह सही दिखाता है या तो वर्टेक्स शेडर या टेक्स्टल लुकअप में कुछ गलत है तो संभव नहीं है। – v01d

+0

हाँ, मेरे पास एक अलग शेडर का उपयोग करके एक चौकोर पर बनावट बना रही है, और यह ठीक काम करता है। मुझे लगता है कि जवाब यह है कि आईपैड हार्डवेयर पर वर्टेक्स शेडर में बनावट लुकअप नहीं किया जा सकता है। – kcbanner

1

मैंने इसे स्वयं से बाहर करने की कोशिश की और Texture2D आईओएस 4.2 के तहत आईपैड (दोनों डिवाइस और सिम्युलेटर) पर काम करता है जब वर्टेक्स शेडर में उपयोग किया जाता है।

मेरा सबसे अच्छा अनुमान यह है कि आपके पास मिप मैपिंग सक्षम है, और यही समस्या है। मैंने देखा कि सिम्युलेटर में Texture2D काम का उपयोग कर वर्टेक्स शेडर में मिप-मैप किए गए लुकअप लेकिन डिवाइस पर नहीं। आप वर्टेक्स शेडर में Texture2D के साथ मिप मैप्स का उपयोग नहीं कर सकते हैं क्योंकि इसका उपयोग करने के लिए कोई भी तरीका नहीं है कि कौन सा मिप-मैप स्तर उपयोग करें। आपको उस बनावट के लिए मिप-मैपिंग को अक्षम करने की आवश्यकता है, या इसके बजाय Texture2DLod का उपयोग करें, जो मिप मानचित्रों का समर्थन करता है।

6
आधिकारिक "iOS के लिए OpenGL ES प्रोग्रामिंग गाइड" से

, अनुभाग "प्लेटफ़ॉर्म नोट्स"

"आप एक शीर्ष शेडर में बनावट लुकअप उपयोग नहीं कर सकते।"

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