2012-08-23 11 views
11

मैं छाया के साथ इलाके उत्पन्न करने के लिए एक शेडर बनाने पर काम कर रहा हूं।तीन जेएस - एक शेडर क्लोनिंग और वर्दी मान बदलना

मेरा प्रारंभिक बिंदु लैम्बर्ट शेडर को क्लोन करना है और अंततः इसे अपनी स्क्रिप्ट के साथ अनुकूलित करने के लिए शेडरमटेरियल का उपयोग करना है।

मानक विधि अच्छी तरह से काम करता है:

var material = new MeshLambertMaterial({map:THREE.ImageUtils.loadTexture('images/texture.jpg')}); 

var mesh = new THREE.Mesh(geometry, material); 

etc 

परिणाम: Result with standard lambert material

हालांकि मैं एक आधार है और यह की चोटी पर काम के रूप में लैम्बर्ट सामग्री का उपयोग करना चाहते हैं, तो मैं यह करने की कोशिश की :

var lambertShader = THREE.ShaderLib['lambert']; 
var uniforms = THREE.UniformsUtils.clone(lambertShader.uniforms); 

var texture = THREE.ImageUtils.loadTexture('images/texture.jpg'); 
uniforms['map'].texture = texture; 

var material = new THREE.ShaderMaterial({ 
    uniforms: uniforms, 
    vertexShader: lambertShader.vertexShader, 
    fragmentShader: lambertShader.fragmentShader, 
    lights:true, 
    fog: true 
}); 

var mesh = new THREE.Mesh(geometry, material); 

इस एक के लिए परिणाम: Result for cloning lambert shader and changing map uniforms

ऐसा लगता है कि शेडर मेरे द्वारा जोड़े गए नए बनावट को ध्यान में नहीं रख रहा है, हालांकि जब मैं वर्दी लॉग करता हूं तो इंस्पेक्टर को देखकर, मानचित्र ऑब्जेक्ट में सही मान होते हैं।

मैं तीन से बहुत नया हूं इसलिए मैं कुछ मौलिक रूप से गलत कर रहा हूं, अगर कोई मुझे सही दिशा में इंगित कर सकता है, तो यह बहुत अच्छा होगा।

यदि मैं सहायक होगा तो मैं डेमो लिंक भी डाल सकता हूं?

धन्यवाद, विल

संपादित करें:

यहाँ कुछ डेमो लिंक कर रहे हैं। शेडर सामग्री के साथ

डेमो: http://dev.thinkjam.com/experiments/threejs/terrain/terrain-shader-material.html

काम कर लैम्बर्ट सामग्री के साथ डेमो: http://dev.thinkjam.com/experiments/threejs/terrain/terrain-lambert-material.html

+0

यूप, डेमो लिंक वास्तव में सहायक होंगे। – mrdoob

+0

हाय mrdoob, त्वरित उत्तर के लिए चीयर्स। मैंने पोस्ट के डेमो लिंक जोड़े हैं। यदि आप इस पर कोई प्रकाश डाल सकते हैं, तो यह आश्चर्यजनक होगा – WillDonohoe

+0

मैंने वेबल रेंडरर के भीतर कुछ कार्यक्षमता देखी है जो तीन के लिए विशिष्ट है।MeshLambertMaterial जो तीन। ShaderMaterial के साथ नहीं होता है। ताज़ा वर्दी के साथ विशेष रूप से। https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js#L4858 यह अंधेरे में केवल एक स्टैब है, लेकिन यह ऐसा कुछ है जो समस्याएं पैदा कर सकता है ? – WillDonohoe

उत्तर

8

कारण यह काम नहीं करता डिफ़ॉल्ट Three.js लैम्बर्ट शेडर है के लिए कि क्या यह निर्धारित करने के पूर्वप्रक्रमक मैक्रो निर्देश #ifdef का उपयोग करता है मानचित्र, envmaps, lightmaps, आदि का उपयोग करें

थ्री.जेएस वेबजीएल रेन्डरर उपयुक्त प्रीप्रोसेसर निर्देश (#define) सेट करता है ताकि शेडर्स के इन टुकड़ों को सक्षम किया जा सके कि सामग्री पर कुछ गुण मौजूद हैं या नहीं वस्तु।

यदि आप डिफ़ॉल्ट शेडर्स को संशोधित करने के लिए & क्लोनिंग के दृष्टिकोण को लेने पर सेट हैं, तो आपको सामग्री पर प्रासंगिक गुण सेट करना होगा।

parameters.map ? "#define USE_MAP" : "" 

तो अपने शेडर सामग्री के लिए material.map = true; सेट करने का प्रयास: बनावट नक्शे के लिए, Three.js WebGLRenderer.js इस लाइन है।

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

+1

धन्यवाद @ फ़ूज़िक! – WillDonohoe

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