2012-05-23 13 views
5

मैं OpenGL ES 2.0 का उपयोग कर एक Android ऐप्लिकेशन है तैयार रंग लाइनों के लिए एक शेडर का उपयोग कैसे करूँ। मुझे एक सरणी से 10 लाइनों को आकर्षित करने की आवश्यकता है जिनमें से प्रत्येक को प्रारंभ बिंदु और अंत बिंदु से वर्णित किया गया है। तो 10 लाइनें = 20 अंक = 60 फ्लोट मान हैं। कोई भी बिंदु कनेक्ट नहीं है इसलिए सरणी में बिंदुओं की प्रत्येक जोड़ी दूसरों से असंबंधित है, इसलिए मैं GL_LINES के साथ आकर्षित करता हूं।मैं साथ GL_LINES और ओपन ES 2.0

public void drawLines(FloatBuffer vertexBuffer, float lineWidth, 
     int numPoints, float colour[]) { 
    GLES20.glLineWidth(lineWidth); 
    drawShape(vertexBuffer, GLES20.GL_LINES, numPoints, colour); 
} 

protected void drawShape(FloatBuffer vertexBuffer, int drawType, 
     int numPoints, float colour[]) { 
    // ... set shader ... 
    GLES20.glDrawArrays(drawType, 0, numPoints); 
} 

drawLines नाव बफर (60 तैरता), एक linewidth, अंकों की संख्या लेता है (20:

मैं उन्हें एक नाव बफर में मान डालने और इस तरह की कुछ सहायक कोड को फोन करके आकर्षित) और एक 4 फ्लोट रंग मूल्य सरणी। मैंने शेडर सेटिंग कोड नहीं दिखाया है, लेकिन यह मूल रूप से रंग परिवर्तक को समान यूकोलर मान में उजागर करता है।

टुकड़ा शेडर कि uColour ऊपर उठाता है बस इसे प्लग सीधे उत्पादन में।

/* Fragment */ 
precision mediump float; 

uniform vec4 uColour; 
uniform float uTime; 

void main() { 
    gl_FragColor = uColour; 
} 

शिखर शेडर:

uniform mat4 uMVPMatrix; 

attribute vec4 vPosition; 

void main() { 
    gl_Position = uMVPMatrix * vPosition; 
} 

लेकिन अब मैं कुछ अलग करना चाहते हैं। मैं अपने बफर में प्रत्येक पंक्ति को एक अलग रंग रखना चाहता हूं। रंग सरणी में रेखा की स्थिति का एक कार्य है। मैं शुरुआत रेखा को सफेद, आखिरी गहरा भूरा और दोनों के बीच एक क्रमिकता के बीच की रेखाओं को छाया करना चाहता हूं, उदा। #ffffff, #eeeeee, #dddddd आदि

मैं स्पष्ट रूप से प्रत्येक पंक्ति को प्रत्येक बार व्यक्तिगत रूप से uColour में एक नया मान प्लग करने के लिए आकर्षित कर सकता हूं लेकिन यह अक्षम है। मैं जीएल 10 बार फोन नहीं करना चाहता हूं जब मैं इसे एक बार कॉल कर सकता हूं और हर बार एक शेडर में मूल्य संशोधित कर सकता हूं।

शायद मैं एक समान मूल्य मेरी शीर्ष शेडर में uVertexCount कहा जाता है की घोषणा कर सकता है? ड्रॉ से पहले मैंने uVertexCount को 0 पर सेट किया है और हर बार वर्टेक्स शेडर कहलाता है, मैं इस मान को बढ़ाता हूं। टुकड़ा शेडर uVertexCount को देख कर लाइन इंडेक्स निर्धारित कर सकता है। इसके बाद यह कुछ प्रारंभ और अंत मूल्य या कुछ अन्य माध्यमों के बीच रंग के लिए एक मूल्य को अलग कर सकता है। लेकिन यह इस बात पर निर्भर करता है कि प्रत्येक पंक्ति या बिंदु को आदिम माना जाता है या रेखाओं की पूरी सरणी एक प्राचीन है।

यह संभव है? मुझे नहीं पता कि कशेरुक शेडर प्रति कशेरुक शेडर कितनी बार बुलाया जाता है। क्या कॉल इस तरह से व्यवहार्य हैं, जैसे कि इसे व्यवहार्य बनाने के लिए, यानी vertex 0, vertex 1, x * खंड, vertex 2, vertex 3, x * खंड आदि

क्या किसी को कुछ उचित नमूना कोड पता है अवधारणा का प्रदर्शन कर सकते हैं या मुझे कुछ ऐसा करने के किसी अन्य तरीके से इंगित कर सकते हैं?

+0

क्यों विशेषता के रूप में रंग का उपयोग नहीं? अपने VertexBuffer में रंग जानकारी जोड़ें। – pearcoding

+0

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

+0

कोई भी स्वचालित रूप से नहीं किया गया ...यदि आपके पास एक समान सरणी है, तो आपको इंडेक्स की आवश्यकता है, लेकिन जब आपके पास कोई विशेषता नहीं है। एक विशेषता केवल एक कशेरुक से जुड़ा हुआ है। तो आपके प्रत्येक ऊर्ध्वाधर में एक स्थिति और रंग होता है। – pearcoding

उत्तर

6

अपने Vertexbuffer (Floatbuffer) में रंगीन जानकारी जोड़ें और अपने शेडर में विशेषता का उपयोग करें।

उदाहरण vertexbuffer:

uniform mat4 uMVPMatrix; 

attribute vec4 vPosition; 
attribute vec3 vColor; 

varying vec3 color; 

void main() { 
    gl_Position = uMVPMatrix * vPosition; 
    color = vColor; 
} 

उदाहरण fragmentshader:

precision mediump float; 

varying vec3 color; 

void main() { 
    gl_FragColor = color; 
} 
+0

क्या आप सुझाव दे रहे हैं कि वे वेक्टर शेडर में vColor को धक्का देने के लिए यहां कुछ तरीकों से glDrawArray के बजाय glDrawElements का उपयोग करते हैं? क्या रंग अंतःस्थापित हो रहा है या इससे कुछ भी हो रहा है या क्या मुझे यह सुनिश्चित करने के लिए स्टार्ट/एंड पॉइंट पर एक ही रंग की आपूर्ति करनी होगी ताकि अलग-अलग मूल्य बदल न जाए? मैं आज कोशिश करता हूं कि यह कैसे चल रहा है यह देखने के लिए मैं इसे आज रात दूंगा। – locka

+2

मुझे लगता है कि मुझे अब मिल गया है। मुझे glvertexAttribPointer/glEnableVertexAttribArray रंगों के लिए फ्लोट की एक सरणी बांधना है। मुझे शायद लाइन के प्रत्येक छोर के लिए रंगों को दोगुना करना है, लेकिन यह काफी सरल होना चाहिए। जब मैं इसके साथ कहीं मिलता हूं तो मैं एक अपडेट पोस्ट करूंगा। – locka

+0

+1 हां यह सही तरीका है: डी – pearcoding

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