2010-07-12 19 views
32

पर एक वैरिएबल पास करना मैं एक आईफोन ऐप लिख रहा हूं जो बनावट पर परिवर्तन करने के लिए जीएलएसएल शेडर्स का उपयोग करता है, लेकिन एक बिंदु है कि मेरे पास थोड़ा मुश्किल समय है, मेरे जीएलएसएल शेडर को चर गुजर रहा है।एक ओपनजीएल जीएलएसएल शेडर

मैंने पढ़ा है कि ओपनजीएल राज्य का एक शेडर पढ़ना संभव है (और मुझे केवल इस चर के लिए केवल पढ़ने की आवश्यकता होगी), लेकिन मुझे यकीन नहीं है कि यह विनिमय कैसे होगा।

संक्षेप में, मैं एक टुकड़ा शेडर के बाहर एक फ्लोट वैल्यू प्राप्त करने की कोशिश कर रहा हूं ताकि टुकड़े के शेडर (चाहे वह पास हो या शेडर के अंदर से पढ़ा जा सके) तक पहुंचा जा सके।

किसी भी मदद/पॉइंटर्स के लिए धन्यवाद जो आप प्रदान कर सकते हैं, इसकी बहुत सराहना की जाती है!

उत्तर

56

एक विकल्प वर्दी चर के माध्यम से जानकारी पास करना है।

:

बाद

glUseProgram(myShaderProgram); 

आप

GLint myUniformLocation = glGetUniformLocation(myShaderProgram, "myUniform"); 

उपयोग कर सकते हैं और उदाहरण

glUniform1f(myUniformLocation, /* some floating point value here */); 

अपने शिखर या टुकड़ा शेडर में के लिए, आप निम्न घोषणा जोड़ने की जरूरत

uniform float myUniform; 

यही है, आपके शेडर में अब आप glUniform1f के माध्यम से पहले गए मान को केवल पढ़ने के लिए (केवल पढ़ने के लिए) एक्सेस कर सकते हैं।

बेशक वर्दी चर किसी भी वैध जीएलएसएल प्रकार के हो सकते हैं जिसमें जटिल प्रकार जैसे सरणी, संरचनाएं या मैट्रिस के रूप में हो सकते हैं। ओपनजीएल सामान्य प्रकार के प्रत्यय, प्रत्येक प्रकार के लिए उपयुक्त glUniform फ़ंक्शन प्रदान करता है। उदाहरण के लिए, vec3 प्रकार के चर को असाइन करने के लिए, glUniform3f या glUniform3fv का उपयोग करेगा।

नोट: मूल्य को शेडर के निष्पादन के दौरान संशोधित नहीं किया जा सकता है, यानी glBegin/glEnd ब्लॉक में। यह केवल पढ़ने के लिए और प्रत्येक खंड/vertex संसाधित के लिए एक ही है।

वर्दी का उपयोग करके कई ट्यूटोरियल भी हैं, आप उन्हें "glsl वर्दी चर" googling द्वारा पा सकते हैं।

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

+0

ग्रेग, यह पूरी तरह से काम किया - धन्यवाद! –

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