2013-10-18 9 views
39

मैं हाल ही में ओपनजीएल और जीएलएसएल के बारे में अधिक जानने के प्रयास में शेडरोई - https://www.shadertoy.com/ के आसपास दस्तक दे रहा हूं।वेबजीएल/जीएलएसएल - शेडरटाय कैसे काम करता है?

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

हालांकि, जब मैं शेडरोटी पर कोड नमूने देखता हूं, तो मुझे केवल एक शेडर प्रोग्राम दिखाई देता है, और अधिकांश ज्यामिति का उपयोग सीधे जीएलएसएल कोड में लिखा जाता है।

यह कैसे काम करता है?

मेरा अनुमान है कि एक कशेरुक शेडर पहले ही तैयार है, और संपादन योग्य/नमूना शेडर केवल एक टुकड़ा शेडर है। लेकिन फिर यह कुछ जटिल उदाहरणों में ज्यामिति की व्याख्या नहीं करता है ...

कोई भी बता सकता है कि शेडरो कैसे काम करता है?

+0

[यह क्यू/ए] देखें (http://stackoverflow.com/questions/9151238/can-anyone-explain-what-this-glsl-fragment-shader-is-doing/9171776#9171776) – gman

उत्तर

49

शेडरटॉय पिक्सेल शेडर्स लिखने का एक साधन है।

पिक्सेल शेडर्स क्या हैं?

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

तो गुण हमेशा एक ही हैं और इसलिए एक शीर्ष शेडर है:

positions = [ [-1,1], [1,1], [-1,-1], [1,-1] ] 
uv = [ [0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [1.0, 1.0] ] 

और वह ट्रैक्टर TRIANGLE_STRIP के रूप में प्रदान की गई है। इसके अलावा, UVs को स्पष्ट रूप से सेट करने के बजाय, कुछ खंड टुकड़े के अंतर्निर्मित चर gl_FragCoord का उपयोग करना पसंद करते हैं, जिसे बाद में विभाजित किया जाता है, उदाहरण के लिए, uniform vec2 uScreenResolution

वर्टेक्स शेडर:

attribute vec2 aPos; 
attribute vec2 aUV; 
varying vec2 vUV; 

void main() { 
    gl_Position = vec4(aPos, 0.0, 1.0); 
    vUV = aUV; 
} 

और टुकड़ा शेडर तो कुछ इस तरह दिखेगा:

uniform vec2 uScreenResolution; 
varying vec2 vUV; 

void main() { 
    // vUV is equal to gl_FragCoord/uScreenResolution 
    // do some pixel shader related work 
    gl_FragColor = vec3(someColor); 
} 

ShaderToy डिफ़ॉल्ट, iResolution (उर्फ uScreenResolution), iGlobalTime पर कुछ वर्दी के साथ आप की आपूर्ति कर सकते, iMouse, ... जो आप अपने पिक्सेल शेडर में उपयोग कर सकते हैं।

सीधे ज्यामिति को कोडिंग शेडर (उर्फ पिक्सेल शेडर) में कोड करने के लिए, डेवलपर रे-ट्रेसिंग नामक कुछ का उपयोग करता है। यह प्रोग्रामिंग का काफी जटिल क्षेत्र है लेकिन संक्षेप में: आप कुछ गणितीय सूत्रों के माध्यम से अपनी ज्यामिति प्रस्तुत करते हैं, और बाद में पिक्सेल शेडर में, जब आप यह जांचना चाहते हैं कि कुछ पिक्सेल आपकी ज्यामिति का हिस्सा है तो आप उस जानकारी को पुनर्प्राप्त करने के लिए उस सूत्र का उपयोग करते हैं। थोड़ा सा Google आपको कितना और कैसे रेस ट्रैसर बिल्कुल बनाया गया है, इसे पढ़ने के लिए आपको बहुत सारे संसाधन देना चाहिए, और इससे मदद मिल सकती है: How to do ray tracing in modern OpenGL?

आशा है कि इससे मदद मिलती है।

+0

क्या करें आप जानते हैं * क्यों * यह इस तरह से काम करता है? क्या यह एक कलात्मक पसंद है, या आमतौर पर कशेरुक शेडर्स का उपयोग करने से अधिक कुशल है? – MasterScrat

+2

आम तौर पर, सीपीयू पर रेट्रैसिंग किया जाता है, और छवि में प्रत्येक पिक्सेल के लिए किरणों को पिक्सेल के माध्यम से देखा जाता है। चूंकि पिक्सेल शेडर एक प्रोग्राम है जो रास्टरराइज्ड आदिम में प्रत्येक पिक्सेल के लिए चलाया जाता है, यह अधिक प्राकृतिक और अंतर्ज्ञानी है, कशेरुक शेडर की तुलना में, रेयट्रैसिंग के लिए खंड शेडर का उपयोग करता है। यह करने के लिए तार्किक बात है, है ना? हालांकि, http://www.vertexshaderart.com/ जैसी चीजें हैं। जीपीयू पर रेट्रैसिंग के लिए वीएस/एफएस के बीच की पसंद तब बनाई जाती है जब आप एक निश्चित शेडर चरण का वास्तविक आउटपुट क्या देखते हैं। –

+0

अद्भुत वेबसाइट, जो ओपनजीएल के लिए नया है और केवल आधुनिक ओपनजीएल, कशेरुक शेडर के लिए "विशेषता = इन", वर्टेक्स शेडर के लिए "भिन्न = बाहर", "अलग-अलग = में" खंड शेडर के लिए, केवल सीखा है। – XueYu

4

ShaderToy सरल GLSL कि सभी प्रकाश, ज्यामिति, आदि को संभालने के लिए प्रोग्राम किया जाता प्रदर्शित करता है, यह शीर्ष ज्यामिति नहीं है, यह, इसमें से अधिकांश, 3 डी सामान raycasting है, या आप 2 डी shaders कर सकते हैं आदि

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

कि shadertoy/GLSL ग्राफिक्स में इस्तेमाल

4

यह सिर्फ मूल रूप से GLSL पिक्सेल शेडर स्रोत कोड धक्का है कर रहे हैं सीधे ग्राफिक्स card.The असली जादू अविश्वसनीय रूप से चतुर एल्गोरिदम में होता है विभिन्न उपकरणों की एक विचार के लिए यात्रा www.iquilezles.org कि लोग अद्भुत प्रभाव बनाने के लिए उपयोग करते हैं, जैसे कि रे मार्चिंग, रे कास्टिंग, रे ट्रेसिंग। कुछ अन्य लाइव जीएलएसएल सैंडबॉक्स जैसे देखने के लिए सबसे अच्छा: http://glsl.heroku.com/ और http://webglplayground.net/। मूल रूप से एक खिड़की बनाते हुए आम तौर पर दो त्रिकोण होते हैं जो स्क्रीन का प्रतिनिधित्व करते हैं, फिर शेडर एक रे ट्रैसर की तरह प्रत्येक पिक्सेल पर काम करता है।
मैं इन्हें थोड़ी देर में देख रहा हूं, और लोगों द्वारा उपयोग किए जाने वाले एल्गोरिदम दिमाग उड़ रहे हैं, आपको कुछ गंभीर गणित चॉपों की आवश्यकता होगी और उनके चारों ओर अपने सिर को लपेटने में सक्षम होने के लिए "डेमो कोडिंग" स्रोत कोड देखेंगे। शेडर खिलौने पर कई, बस अपने दिमाग को उड़ाओ! तो संक्षेप में, आपको केवल जीएलएसएल शेडर कोडिंग और एल्गोरिदम सीखने की आवश्यकता है। कोई आसान समाधान नहीं।

1

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

लेकिन यह आकार परिभाषित करने का एकमात्र तरीका नहीं है। जैसे एक बनावट को प्रक्रियात्मक रूप से परिभाषित किया जा सकता है (इसके ग्रंथों को देखने के बजाय), एक आकार को प्रक्रियात्मक रूप से परिभाषित किया जा सकता है (इसकी ज्यामिति को देखने के बजाय)।

तो, रे ट्रेसिंग के समान, ये टुकड़े शेडर्स उनके ज्यामिति को शिखर द्वारा परिभाषित किए बिना आकार बनाने में सक्षम हैं।

आकार परिभाषित करने के अभी भी और तरीके हैं। जैसे मात्रा डेटा (voxels), सतह घटता, और इतने पर। एक कंप्यूटर ग्राफिक्स पाठ उनमें से कुछ को कवर करना चाहिए।

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