2011-11-11 8 views
57

मैं ओपनजीएल की रोशनी छोड़ना चाहता हूं और अपना खुद का बनाना चाहता हूं। मैं अपने शेडर्स को रोशनी की एक चर संख्या के लिए अनुमति देना चाहता हूं।जीएलएसएल/सी ++: वर्दी के Arrays?

क्या हम जीएलएसएल शेडर्स में वर्दी की एक सरणी घोषित कर सकते हैं? यदि हां, तो हम उन वर्दी के मूल्य कैसे निर्धारित करेंगे?

+4

कोई भी जो रोशनी की एक चर संख्या चाहता है, केवल सभ्य क्षमताओं के साथ सरणी बनाते हैं, और इस बात की गिनती रखें कि वर्तमान में कितनी रोशनी सक्रिय हैं। जीएलएसएल परिवर्तनीय आकार के सरणी की अनुमति नहीं देता है (सभी सरणी आकार स्थिर, हार्ड-कोड वाले मान होना चाहिए)। – Miles

उत्तर

71

हाँ यह संभव है। आप समान एरे घोषित करते हैं कि आप इसे सी में कैसे करेंगे, उदा।

uniform float v[10]; 

तो फिर तुम GLSL shaders में वर्दी की एक सरणी घोषित करने के लिए glUniform{1,2,3,4}{f,i}v

GLfloat v[10] = {...}; 
glUniform1fv(glGetUniformLocation(program, "v"), 10, v); 
+2

1, 2, 3, 4 क्या संदर्भित करता है? क्या इसका मतलब है कि मैं केवल चार सदस्यों तक सरणी के मान निर्धारित कर सकता हूं? – Miles

+0

यह 'glUniform1fv' का एक बहुत चालाक/घुमावदार उपयोग है। एक सोचता है कि 'glUniform1fv' का दूसरा पैरामीटर सिर्फ एक औपचारिकता है और इसे हमेशा 1. – bobobobo

+0

के रूप में उपयोग किया जाना चाहिए तो तकनीकी रूप से आप' glUniform1fv (uniformId, 4, v) का उपयोग करके एक समान 'vec4' सेट कर सकते हैं;' जहां 'v' 4 फ्लोट्स की एक सरणी है। – bobobobo

7

हाँ, यह संभव है का उपयोग कर अपने मूल्यों को निर्धारित कर सकते हैं। कुछ उदाहरणों के लिए बस "glsl वर्दी सरणी" गूगल (संपादित करें: या डेटनवॉल्फ का उदाहरण देखें)। हालांकि अलग-अलग ग्राफिक्स कार्डों पर कितनी वर्दी भेजी जा सकती है, इस पर सीमाएं हैं (कम से कम पुराने लोगों पर, मुझे वर्तमान लोगों के बारे में निश्चित नहीं है (हालांकि मुझे लगता है कि अभी भी वहां होगा))।

यदि आप वर्दी के मार्ग पर जाने का फैसला करते हैं, तो मैं वर्दी बफर का उपयोग करने का सुझाव दूंगा। http://www.opengl.org/wiki/Uniform_Buffer_Object के अनुसार, "वर्दी बफर बाइंडिंग के बीच स्विचिंग आमतौर पर एक प्रोग्राम में दर्जनों वर्दी स्विच करने से तेज होती है"।

यदि आपके पास बड़ी संख्या में रोशनी और पैरामीटर हैं, तो आप डेटा को फ्लोट बफर के रूप में भी भेज सकते हैं।

+6

समान बफर ऑब्जेक्ट केवल जीएल संस्करण 3.1 के बाद उपलब्ध हैं। संस्करण 2.0 के बाद से ARB_Uniform_Buffer_Object एक्सटेंशन की आवश्यकता है। –

+54

गुगलिंग "glsl वर्दी सरणी" अब इस पृष्ठ को पहले परिणाम के रूप में लौटाती है !! अब हम क्या करें? – mlvljr

+1

'ग्लिंट परिणाम के साथ अधिकतम संख्या में वर्दी प्राप्त करने के लिए आप रनटाइम पर ओपनजीएल से पूछ सकते हैं; glGetIntegerv (GL_MAX_UNIFORM_LOCATIONS, 0, और परिणाम); ' – rwols