2013-07-01 5 views
5

मैं हजारों क्यूब्स खींचने के लिए एक बफर जीमेट्री का उपयोग कर रहा हूं जो इलाके को बनाता है, लेकिन अगर मुझे क्यूबों में से किसी एक की स्थिति बदलने की ज़रूरत है तो ज्यामिति को कैसे अपडेट किया जाए, यह जानने में कठिनाई हो रही है। उदाहरण के लिए, मैं अपने ज्यामिति को प्रारंभ करने के लिए इस कोड है: (मैं this example के एक अद्यतन संस्करण पर अपना परीक्षण कर रहा हूँ)एक बड़े बफर जीमेट्री को तुरंत कैसे अपडेट करें?

// 12 triangles per cube (6 quads) 
var triangles = 12 * 150000; 

var geometry = new THREE.BufferGeometry(); 
geometry.attributes = { 

    position: { 
     itemSize: 3, 
     array: new Float32Array(triangles * 3 * 3), 
     numItems: triangles * 3 * 3 
    }, 

    normal: { 
     itemSize: 3, 
     array: new Float32Array(triangles * 3 * 3), 
     numItems: triangles * 3 * 3 
    }, 

    color: { 
     itemSize: 3, 
     array: new Float32Array(triangles * 3 * 3), 
     numItems: triangles * 3 * 3 
    } 
} 

positions = geometry.attributes.position.array; 
normals = geometry.attributes.normal.array; 
colors = geometry.attributes.color.array; 

अगर मैं एक घन ले जाते हैं, जब तक मैं ऐसा करने के लिए ले जाया जा दिखाई नहीं देगा :

geometry.attributes.position.needsUpdate = true; 

यह अपडेट होने के दौरान एफपीएस को छोड़ने का कारण बनता है। क्या मैं ऐसा कर सकता हूं? जब मैं केवल एक घन (12 त्रिकोण/36 शिखर) बदल रहा हूं तो थोड़ा अनावश्यक लगता है। हालांकि यह हो सकता है - मैंने जांच नहीं की है कि needsUpdate वास्तव में क्या करता है। अनुमान लगाया कि यह सरणी को फिर से सरणी भेजता है।

मैं सोच रहा था कि मैं ज्यामिति को अलग छोटे बफर जीमेट्रीज़ में विभाजित कर सकता हूं लेकिन मुझे यकीन नहीं है कि इससे समग्र प्रदर्शन में मदद मिलेगी। जो मैं समझता हूं, उससे अधिक ज्यामिति = कम एफपीएस।

अगर किसी के पास कोई विचार है कि मैं यह कैसे करूं, तो इसकी सराहना की जाएगी! :) अद्यतन करने के मुद्दे के अलावा, बफर जीमेट्री मुझे बिल्कुल वही लगता है जो मुझे चाहिए। धन्यवाद!

उत्तर

7

इसमें कुछ ऊर्ध्वाधर अपडेट करते समय मुझे एक बहुत बड़ी बफर जीमेट्री के साथ एक ही समस्या थी।

एक समाधान बफर के केवल एक हिस्से को अद्यतन करने के लिए _gl.bufferData के बजाय _gl.bufferSubData का उपयोग करना है। (तीन जेएस केवल _gl.bufferData का उपयोग करता है)।

तो अगर आप पदों को अद्यतन आप क्या करेंगे:

// offsetSubEnd को

var view = geometry.attributes.position.array.subarray(offsetSub, offsetSubEnd);

// पदों के लिए बफर में आबद्ध सूचकांक offsetSub से अद्यतन करने के लिए डेटा का एक दृश्य बनाएं (webglrenderer साथ जीएल संदर्भ)

_gl.bindBuffer(_gl.ARRAY_BUFFER, geometry.attributes.position.buffer);

// डालें नई मिल GPU बफर में अच्छा सूचकांक में मूल्यों (offsetGeometry बाइट में है)

_gl.bufferSubData(_gl.ARRAY_BUFFER, offsetGeometry,view);

ध्यान दें कि यह समाधान धीमी अगर आप _gl.bufferData की तुलना में बफर कोने का एक बड़ा हिस्सा बदल हो सकता है।

6

r71 के रूप में तीनjs bufferSubData का समर्थन करता है।

उपयोग एक DynamicBufferAttribute, (या बस updateRange सही तरीके से सेट)

var positionAttr = geometry.attributes.position 
// if not using DynamicBufferAttribute initialize updateRange: 
// positionAttr.updateRange = {}; 
positionAttr.updateRange.offset = 0; // where to start updating 
positionAttr.updateRange.count = 1; // how many vertices to update 
positionAttr.needsUpdate = true; 
नहीं
+2

यकीन है कि कौन-सा संस्करण यह बदल गया था, लेकिन 'की r81' इस [' BufferAttribute'] (https में विलय कर दिया गया है के रूप में: // github.com/mrdoob/three.js/blob/r81/src/core/BufferAttribute.js#L27)। – Jay

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