2013-01-03 42 views
17

मेरे पास THREE.Mesh ऑब्जेक्ट्स की एक बड़ी संख्या (~ 1000) है जो THREE.Geometry और THREE.MeshPhongMaterial (जिसमें एक नक्शा है) से बनाया गया है।एक ही ज्यामिति और सामग्री के साथ कई मेष, क्या मैं उनके रंग बदल सकता हूं?

मैं इन वस्तुओं को अलग-अलग रंग (रंग) करना चाहता हूं।

नाइवेली, मैंने mesh.material.color संपत्ति को बदलने की कोशिश की, लेकिन किसी भी वस्तु पर इस संपत्ति को बदलने से सभी वस्तुओं का रंग एक बार में बदल जाता है। यह समझ में आता है, क्योंकि केवल एक ही सामग्री है जो सभी वस्तुओं के बीच साझा की जाती है।

मेरा अगला विचार प्रत्येक ऑब्जेक्ट के लिए अलग THREE.MeshPhongMaterial बनाना था। तो, अब मेरे पास THREE.Mesh ऑब्जेक्ट्स की एक बड़ी संख्या है जो उसी THREE.Geometry से बनाई गई थी, लेकिन व्यक्तिगत THREE.MeshPhongMaterials (जो वही बनावट साझा करती है) है। यह मुझे व्यक्तिगत रूप से रंग बदलने की अनुमति देता है, लेकिन प्रदर्शन खराब है। क्रोम प्रोफाइलियर से पता चलता है कि ऐप भौतिक-चीजों को बदलने जैसी महत्वपूर्ण चीजें कर रहा है।

सामग्री रंग केवल शेडर में एक वर्दी है। तो, उस वर्दी को अद्यतन करना बहुत तेज़ होना चाहिए।

प्रश्न: जाल स्तर से सामग्री रंग को ओवरराइड करने का कोई तरीका है?

यदि वहां था, तो मुझे विश्वास है कि मैं अपनी सभी वस्तुओं के बीच सामग्री साझा कर सकता हूं और अपना प्रदर्शन वापस प्राप्त कर सकता हूं, जबकि रंग अलग-अलग बदलते हैं।

[मैं v49 और v54 पर परीक्षण किया है, वे समान प्रदर्शन और गिरावट है]

अद्यतन: मैं एक टेस्ट केस का निर्माण किया है, और इस की वजह से प्रदर्शन बूंद से छोटी मैंने सोचा कि यह किया गया है, लेकिन अभी भी मापनीय है।

यहाँ दो लिंक हैं:

पहले मामले में, केवल दो सामग्री, दूसरे मामले में प्रत्येक घन यह अपनी सामग्री है है कर रहे हैं। मैं इस मशीन पर 53 एफपीएस होने के पहले मामले के फ्रेमरेट को मापता हूं, और दूसरा फ्रेमरेट 46 एफपीएस है। यह लगभग 15% ड्रॉप है।

दोनों मामलों में, हर घन के सामग्री का रंग हर फ्रेम बदल जाता है। कई सामग्रियों के मामले में, हम वास्तव में प्रत्येक घन को अपने स्वयं के रंग प्राप्त करते देखते हैं, केवल दो सामग्रियों के मामले में, हम उन्हें सभी एक ही रंग (अपेक्षित के रूप में) देखते हैं।

+2

उहम, जो "बग" जैसा लगता है। यदि आप r54 के साथ समस्या को पुन: उत्पन्न कर सकते हैं तो यह बहुत अच्छा होगा अगर आप इसे गीथब के मुद्दों अनुभाग में रिपोर्ट कर सकते हैं। – mrdoob

+0

धन्यवाद @ mrdoob। मैंने एक मुद्दा जोड़ा है: https://github.com/mrdoob/three.js/issues/2916 – Harold

उत्तर

0

यदि आप अपने खुद के शेडर्स लिख रहे हैं, तो आप एक सामान्य टिंट (वर्टेक्स विशिष्ट नहीं) के लिए uniform चर का उपयोग कर सकते हैं और समग्र रंग में फैक्टरिंग के लिए शेडर में पास कर सकते हैं। vec4f_t और vec4f() सी भाग में मानक नहीं हैं, लेकिन आपके कोड में पहले से ही समकक्ष हैं।

सी:

vec4f_t hue = vec4f(....); // fill in as desired 
// load the shader so that GLuint shader_id is available. 
// "hue" is a uniform var in the vertexshader 
GLUint hue_id = glGetUniformLocation(shader_id, "hue"); 
// later, before rendering the object: 
glUniform4fv(hue_id, 1, &hue); 

।vertexshader:

uniform vec4 hue; // add this and use it in the texture's color computation 
+0

स्वाभाविक रूप से। (: हालांकि, मैं प्रदर्शन में गिरावट के बिना अंतर्निर्मित सामग्री के साथ ऐसा करने में सक्षम होना चाहता हूं। (यानी, केवल अपनी योजना के समान वर्दी सेट के लिए भुगतान करें, जो सुपर-फास्ट होना चाहिए) – Harold

+0

मेरी इंप्रेशन है कि वर्टेक्स रंग (भौतिक रंगों द्वारा नहीं) का समर्थन करने वाले अधिकांश शेडर्स को सरणी के लिए एक सरणी को सौंपने की उम्मीद होती है - एक अनुक्रमित सरणी निकटतम हो सकती है। vec4 hue विचार एक घटक के रूप में काफी असामान्य लगता है, लेकिन होना चाहिए एक कशेरुक शेडर के कशेरुक रंग गणना में जोड़ने के लिए बहुत आसान है। यदि आप केवल पूर्वनिर्धारित शेडर्स के साथ मूल्यवान होने की योजना बना रहे हैं, हालांकि, अभी भी एक मौका है कि पूरी तरह से वेब खोज एक हो सकती है। –

+0

आपके उत्तर के लिए धन्यवाद। मैं विशेष रूप से पूछ रहा था तीन.जेएस वेबजीएल लाइब्रेरी के बारे में। आपका उत्तर सीधे ओपनजीएल का उपयोग करने से संबंधित है। (जो किसी और के लिए सहायक हो सकता है) – Harold

3

हां। प्रति ऑब्जेक्ट, material.clone() का उपयोग करके अपनी सामग्री को क्लोन करें, emissive और color संशोधित करें, और ऑब्जेक्ट की सामग्री को इस क्लोन में सेट करें। शेडर्स और विशेषताओं को संदर्भ द्वारा प्रतिलिपि बनाई जाती है, इसलिए चिंता न करें कि आप हर बार पूरी सामग्री को क्लोन कर रहे हैं; वास्तव में मूल्यों द्वारा प्रतिलिपि बनाई गई एकमात्र चीजें वर्दी (जैसे emissive और color) हैं। तो आप इन व्यक्तिगत ऑब्जेक्ट को बदल सकते हैं।

व्यक्तिगत रूप से मैं मूल सामग्री को ऑब्जेक्ट की एक अलग, कस्टम प्रॉपर्टी पर संग्रहीत करता हूं ताकि मैं आसानी से बाद में इसे वापस कर सकूं; निर्भर करता है कि आपकी ज़रूरतें क्या हैं।

+0

क्या आप "अपनी सामग्री क्लोन" पर विस्तार कर सकते हैं? क्या यह रचनात्मक से अलग है प्रत्येक ऑब्जेक्ट के लिए एक नया 'THREE.MeshPhongMaterial'? यदि हां, तो कैसे? – Harold

+0

@ हैरॉल्ड 'material.clone()'। यह आधार 'सामग्री' वर्ग के लिए एपीआई दस्तावेज़ों में है। और यह तीन अन्य प्रकार की वस्तुओं के लिए तीन.जेएस में मौजूद है। चूंकि मुझे नहीं पता कि आप पहले एक अलग भौतिक वस्तु बनाने के बारे में कैसे गए थे, मैं आपको यह नहीं बता सका कि यह वही या अलग है। मैं आपको बता सकता हूं कि अधिकांश डेटा संदर्भ द्वारा साझा किया जाता है। –

+0

अगर मुझे मौका मिलता है तो मैं इसका प्रयोग करूंगा; हम वर्तमान में '.clone()' का उपयोग नहीं कर रहे हैं। विचार के लिए धन्यवाद। – Harold

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

  • कोई संबंधित समस्या नहीं^_^