2012-02-06 16 views
18

ओपनजीएल चश्मे पढ़ने में, मैंने देखा है कि इसमें एक उल्लेख है कि आप एक ही प्रोग्राम में एक ही तरह के कई शेडर्स शामिल कर सकते हैं (यानी GlAttachShader से जुड़े एक से अधिक GL_VERTEX_SHADER)। विशेष रूप से ओपनजीएल 4.2, §2.11.3, प्रोग्राम ऑब्जेक्ट्स में: "एक ही प्रकार की एकाधिक शेडर ऑब्जेक्ट्स को एक प्रोग्राम ऑब्जेक्ट से जोड़ा जा सकता है ..."।एक ही ओपनजीएल प्रोग्राम में एक ही प्रकार के एकाधिक शेडर्स संलग्न करना?

ओपनजीएल पाइपलाइन प्रोग्राम और सबराउटिन यहां लागू हो सकते हैं, लेकिन यह अस्तित्व से पहले परिभाषित किया गया था (वास्तव में यह 2.1 spec, §2.15.2 पर वापस चला जाता है) इसलिए मैं इस विचार के पूर्व-जीएल 4 उदाहरण की तलाश में हूं। जब मैंने कुछ सरल परीक्षण किया, तो मैंने पाया कि एक से अधिक void main() लिंकिंग त्रुटियों का कारण बनता है। क्या किसी को व्यावहारिक उदाहरण के बारे में पता है जहां इसका उपयोग किया जाता है?

+0

मुझे यकीन नहीं है कि यह काम करता है, लेकिन मुझे लगता है कि आप सामान्य कार्यों (लेकिन कोई मुख्य कार्य नहीं) के साथ शेडर्स प्राप्त कर सकते हैं ताकि आप इन्हें पोर्ग्राम में संलग्न कर सकें और इन कार्यों को मुख्य-शेडर से एक्सेस कर सकें। इस तरह आपको केवल एक बार उन कार्यों को संकलित करने की आवश्यकता है। –

उत्तर

26

आप अलग शेडर में आम कार्यों डाल सकते हैं। फिर इसे केवल एक बार संकलित करें, और कई कार्यक्रमों में लिंक करें।

यह समान है कि आप अपनी सीपीपी फ़ाइलों को स्थिर या साझा लाइब्रेरी प्राप्त करने के लिए केवल एक बार कैसे संकलित करते हैं। फिर आप इस लाइब्रेरी को कई निष्पादन योग्य प्रोग्रामों में लिंक करते हैं, इस प्रकार संकलन समय बचाते हैं।

vec3 ComputeLighting(vec3 position, vec3 eyeDir); 

void main() 
{ 
    vec3 light = ComputeLighting(arg1, arg2); 
    gl_FragColor = ...; 
} 

तो फिर तुम अलग से आम शेडर और अपने मुख्य संकलन:

vec3 ComputeLighting(vec3 position, vec3 eyeDir) 
{ 
    // ... 
    return vec3(...); 
} 
फिर शेडर के प्रत्येक जहां इस कार्यक्षमता का उपयोग करने के लिए इस करना चाहती के लिए

:

मान लीजिए कि आप जटिल प्रकाश समारोह करते हैं शेडर। लेकिन केवल एक बार आम शेडर का संकलन करें।

+0

बेशक, यह पूरी तरह से समझ में आता है। धन्यवाद! –

7

मैंने पाया कि सहित एक से अधिक शून्य मुख्य() जोड़ने त्रुटियों

वजह से प्रत्येक शेडर चरण केवल एक मुख्य प्रवेश समारोह वहाँ होना चाहिए के लिए।

एक व्यावहारिक उदाहरण जहां इसका उपयोग किया जाता है (प्री-जीएल 4)?

आप एक शेडर स्रोत में एक समारोह घोषणा कर सकते हैं और न इसे परिभाषित है, और समय को जोड़ने पर आपको एक और शेडर स्रोत (बहुत C/C++ जोड़ने के समान) से एक परिभाषा प्रदान कर सकते हैं।

उदाहरण:

generate_txcoord.glsl:

#version 330 
precision highp float; 

const vec2 madd = vec2(0.5, 0.5); 

vec2 generate_txcoord(vec2 v) 
{ 
    return v * madd + madd; 
} 

vertex.glsl:

#version 330 
precision highp float; 

in vec2 vxpos; 

out vec2 out_txcoord; 

vec2 generate_txcoord(vec2 vxpos); // << declared, but not defined 

void main() 
{ 
    // generate 0..+1 domain txcoords and interpolate them 
    out_txcoord = generate_txcoord(vxpos); 

    // interpolate -1..+1 domain vxpos 
    gl_Position = vec4(vxpos, 0.0, 1.0); 
} 
संबंधित मुद्दे