2012-01-09 19 views
6

मैं सामान को संशोधित करने से पहले बस एक साधारण ज्यामिति शेडर लिखने की कोशिश कर रहा हूं जो कि केवल कोबिस के माध्यम से गुज़रता है।जीएलएसएल 1.5 सरल ज्यामिति शेडर

मेरे शिखर शेडर है

#version 150 core 
in vec3 inPosition; 
in vec4 inColor; 

out vec4 vertexColor; 

void main() { 
    vertexColor = inColor; 
    gl_Position = vec4(inPosition, 1.0); 
} 

मेरे ज्यामिति शेडर

#version 150 core 
layout (triangles) in; 
layout (triangle_strip, max_vertices=3) out; 

void main() { 
    gl_Position = gl_in[0].gl_Position; 
    EmitVertex(); 

    gl_Position = gl_in[1].gl_Position; 
    EmitVertex(); 

    gl_Position = gl_in[2].gl_Position; 
    EmitVertex(); 
    EndPrimitive(); 
} 

सब कुछ ठीक काम करता है और मेरे टुकड़ा शेडर ज्यामिति शेडर में जुड़े हुए बिना

#version 150 core 
in vec4 vertexColor; 
out vec4 fragColor; 

void main() { 
    fragColor = vertexColor; 
} 

है। हालांकि जब मैं ज्यामिति शेडर में लिंक करता हूं तो यह काम करना बंद कर देता है। यह क्या है कि मैं याद कर रहा हूँ? क्या मेरे ज्यामिति शेडर को मेरे वर्टेक्स शेडर से vertexColor के लिए इनपुट की आवश्यकता है और यदि ऐसा है तो यह कैसे किया जाता है?

+0

http://en.wikipedia.org/wiki/GLSL#A_sample_trivial_GLSL_geometry_shader? – n0rd

+0

यह मेरे प्रश्न का उत्तर नहीं देता है। मेरा ज्यामिति शेडर लूप को हटाए जाने के अपवाद के साथ उस पृष्ठ पर सूचीबद्ध एक जैसा ही है। हालांकि यह काम नहीं करता है। कुछ भी नहीं खींचा जाता है। इसके अलावा उस पृष्ठ पर दिखाए गए कशेरुक और टुकड़े के शेडर्स glsl 1 के लिए हैं।20 इन सभी को एक साथ जोड़ने में एक समस्या है जिसे मैं समझ नहीं पा रहा हूं और न ही मुझे कैसे ठीक किया जाए इस बारे में कोई जानकारी मिल सकती है। – user1139069

उत्तर

7

मेरे ज्यामिति शेडर वास्तव में उस पृष्ठ

हाँ पर सूचीबद्ध एक के रूप में ही है, लेकिन अपने मानार्थ शीर्ष और टुकड़ा shaders नहीं हैं।

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

आपके वर्टेक्स शेडर में दो आउटपुट हैं: gl_Position, और vertexColor। आपका ज्यामिति शेडर हालांकि एक इनपुट लेता है: gl_in[0].gl_Position। यह जीएलएसएल में कानूनी नहीं है: यदि एक चरण एक मूल्य का उत्पादन करता है, तो अगले चरण को इनपुट करना होगा। जीएलएसएल-परिभाषित मूल्यों जैसे gl_Position के लिए एकमात्र अपवाद हैं, जो रास्टरराइज़र द्वारा उपभोग किया जाता है।

आपका पास-थ्रू जीएस वास्तव में के माध्यम से डेटा को पास करने की आवश्यकता है यदि आप इसे पास-थ्रू करना चाहते हैं।

in vec4 vertexColor[]; 

हालांकि, GLSL में वैश्विक चर एक ही नाम नहीं किया जा सकता है: आप अपने जी एस में उचित इनपुट लेने के लिए की जरूरत है। इसलिए आप आउटपुट के रूप में और इनपुट के रूप में vertexColor नहीं ले सकते हैं। तो बजाय, आप उत्पादन का नाम बदलने के लिए (या interface blocks का उपयोग करें) करने के लिए है:

out vec4 gsColor; 

आपका टुकड़ा शेडर अब in vec4 gsColor; लेने के लिए और उस के साथ काम करना चाहिए।

जब आप इन शेडरों को जोड़ने का प्रयास करते थे, तो आपके कंपाइलर को आपको मेल खाने के बारे में समझाते हुए उचित जानकारी-लॉग देना चाहिए था। क्या आपके शेडर्स लिंक करने में विफल होने पर आपको अपनी जानकारी-लॉग मिल रही हैं? यदि नहीं, तो आपको चाहिए।

+0

क्या gsColor को सरणी होने की आवश्यकता है और यदि मैं जोड़ों को जोड़ता हूं तो gscolor आउटपुट अतिरिक्त कोड्स से कैसे मेल खाता है? यदि gscolor एक सरणी होना चाहिए जैसा कि मैं अनुमान लगा रहा हूं कि यह होना चाहिए, क्या उस सरणी की अनुक्रमणिका उन शीर्षकों के क्रम से मेल खाती है जो मैं उत्सर्जित कर रहा हूं? ज्यामिति शेडर में – user1139069

+0

'gl_Position' या तो एक सरणी नहीं है। आप प्रत्येक आउटपुट लिखते हैं, फिर उन सभी आउटपुट का उत्पादन करने के लिए 'EmitVertex' पर कॉल करें। आप उत्सर्जित प्रत्येक चरम के लिए 'gscolor' सेट करते हैं, जैसे कि आप उत्सर्जित प्रत्येक चरम के लिए' gl_Position' सेट करते हैं। –

+0

तो कुछ 'gl_Position = gl_in [0] .gl_Position; gscolor = vertexcolor [0] EmitVertex(); gl_Position = gl_in [1] .gl_Position; gscolor = vertexcolor [1] EmitVertex(); '? – user1139069

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