提交 07089eff 编写于 作者: L Lewy Blue

Added BufferGeometry section

上级 de541600
......@@ -34,24 +34,106 @@ object.updateMatrix();
<h2>Geometries</h2>
<div>
<p>
You can only update the content of buffers, you cannot resize buffers (this is very costly,
basically equivalent to creating new geometry).
</p>
<p>
You can emulate resizing by pre-allocating a larger buffer and then keeping unneeded vertices
collapsed / hidden.
</p>
<p>
The following flag control updating of various geometry attributes. Set flags only
for attributes that you need to update, updates are costly. Once buffers
change, these flags reset automatically back to false. You need to keep setting them to
true if you wanna keep updating buffers. Note that this applies only to [page:Geometry]
and not to [page:BufferGeometry].
</p>
<code>
<h3>[page:BufferGeometry]</h3>
<div>
<p>
BufferGeometries store information (such as vertex positions, face indices, normals, colors,
UVs, and any custom attributes) in [page:BufferAttribute buffers] - that is,
[link:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays typed arrays].
This makes them generally faster than standard Geometries, at the cost of being somewhat harder to
work with.
</p>
<p>
With regards to updating BufferGeometries, the most important thing to understand is that you
you cannot resize buffers (this is very costly, basically the equivalent to creating new a geometry).
You can however update the content of buffers.
</p>
<p>
This means that if you know an attribute of you BufferGeometry will grow, say the number of vertices,
you must pre-allocate a buffer large enough to hold any new vertices that may be created. Of
course, this also means that there will be a maximum size for your BufferGeometry - there is
no way to create a BufferGeometry that can efficiently be extended indefinitely.
</p>
<p>
We'll use the example of a line that gets extended at render time. We'll allocate space
in the buffer for 500 vertices but draw only two at first, using [page:BufferGeometry.drawRange].
</p>
<code>
var MAX_POINTS = 500;
// geometry
var geometry = new THREE.BufferGeometry();
// attributes
var positions = new Float32Array( MAX_POINTS * 3 ); // 3 vertices per point
geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
// draw range
drawCount = 2; // draw the first 2 points, only
geometry.setDrawRange( 0, drawCount );
// material
var material = new THREE.LineBasicMaterial( { color: 0xff0000, linewidth: 2 } );
// line
line = new THREE.Line( geometry, material );
scene.add( line );
</code>
<p>
Next we'll randomly add points to the line using a pattern like:
</p>
<code>
var positions = line.geometry.attributes.position.array;
var x = y = z = index = 0;
for ( var i = 0, l = MAX_POINTS; i < l; i ++ ) {
positions[ index ++ ] = x;
positions[ index ++ ] = y;
positions[ index ++ ] = z;
x += ( Math.random() - 0.5 ) * 30;
y += ( Math.random() - 0.5 ) * 30;
z += ( Math.random() - 0.5 ) * 30;
}
</code>
<p>
If you want to change the <em>number of points</em> rendered after the first render, do this:
</p>
<code>
line.geometry.setDrawRange( 0, newValue );
</code>
<p>
If you want to change the position data values after the first render, you need to
set the needsUpdate flag like so:
</p>
<code>
line.geometry.attributes.position.needsUpdate = true; // required after the first render
</code>
<p>
[link:http://jsfiddle.net/w67tzfhx/ Here is a fiddle] showing an animated line which you can adapt to your use case.
</p>
<h4>Examples:</h4>
[example:webgl_custom_attributes WebGL / custom / attributes]<br />
[example:webgl_buffergeometry_custom_attributes_particles WebGL / buffergeometry / custom / attributes / particles]
</div>
<h3>[page:Geometry]</h3>
<div>
<p>
The following flag control updating of various geometry attributes. Set flags only
for attributes that you need to update, updates are costly. Once buffers
change, these flags reset automatically back to false. You need to keep setting them to
true if you wanna keep updating buffers. Note that this applies only to [page:Geometry]
and not to [page:BufferGeometry].
</p>
<code>
var geometry = new THREE.Geometry();
geometry.verticesNeedUpdate = true;
geometry.elementsNeedUpdate = true;
......@@ -60,22 +142,22 @@ geometry.uvsNeedUpdate = true;
geometry.normalsNeedUpdate = true;
geometry.colorsNeedUpdate = true;
geometry.tangentsNeedUpdate = true;
</code>
</code>
<p>
In versions prior to [link:https://github.com/mrdoob/three.js/releases/tag/r66 r66] meshes
additionally need the <em>dynamic</em> flag enabled (to keep internal typed arrays):
</p>
<p>
In versions prior to [link:https://github.com/mrdoob/three.js/releases/tag/r66 r66] meshes
additionally need the <em>dynamic</em> flag enabled (to keep internal typed arrays):
</p>
<code>
//removed after r66
geometry.dynamic = true;
</code>
<code>
//removed after r66
geometry.dynamic = true;
</code>
<h4>Example:</h4>
[example:webgl_geometry_dynamic WebGL / geometry / dynamic]<br />
</div>
<h3>Examples:</h3>
[example:webgl_geometry_dynamic WebGL / geometry / dynamic]<br />
[example:webgl_custom_attributes WebGL / custom / attributes]<br />
[example:webgl_custom_attributes_particles WebGL / custom / attributes / particles]
</div>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册