我一直在尝试构建 3D Angular 色。整个模型有大约 50 个立方体/长方体,但形状在第 35 个形状后停止构建。代码已经很长了,但我不知道为什么其余的形状没有显示。
js代码如下:
var canvas;
var gl;
var total= 1188;
var vertex= [];
var vertexColors =[];
var indices =[];
window.onload = function init()
{
canvas = document.getElementById( "gl-canvas" );
gl = WebGLUtils.setupWebGL( canvas );
if ( !gl ) { alert( "WebGL isn't available" ); }
gl.viewport( 0, 0, canvas.width, canvas.height );
gl.clearColor( 0.0,0.0,1.0, 1.0 );
gl.enable(gl.DEPTH_TEST);
var program = initShaders( gl, "vertex-shader", "fragment-shader" );
gl.useProgram( program );
var iBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, iBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array(indices), gl.STATIC_DRAW);
var cBuffer = gl.createBuffer();
gl.bindBuffer( gl.ARRAY_BUFFER, cBuffer );
gl.bufferData( gl.ARRAY_BUFFER, flatten(vertexColors), gl.STATIC_DRAW );
var vColor = gl.getAttribLocation( program, "vColor" );
gl.vertexAttribPointer( vColor, 4, gl.FLOAT, false, 0, 0 );
gl.enableVertexAttribArray( vColor );
var vBuffer = gl.createBuffer();
gl.bindBuffer( gl.ARRAY_BUFFER, vBuffer );
gl.bufferData( gl.ARRAY_BUFFER, flatten(vertices), gl.STATIC_DRAW );
var vPosition = gl.getAttribLocation( program, "vPosition" );
gl.vertexAttribPointer( vPosition, 3, gl.FLOAT, false, 0, 0 );
gl.enableVertexAttribArray( vPosition );
render();
}
function render()
{
gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
theta[axis] += 1.0;
gl.uniform3fv(thetaLoc, theta);
gl.drawElements( gl.TRIANGLES, total, gl.UNSIGNED_BYTE, 0 );
requestAnimFrame( render );
}
我尝试过更改浏览器并编辑我的代码,但似乎仍然不起作用。
最佳答案
您正在使用UNSIGNED_BYTE
索引。 UNSIGNED_BYTE
只能保存 0 到 255 之间的值,因此您不能使用超过 255 个顶点。
更改此行
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array(indices), gl.STATIC_DRAW);
到此
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
以及你的画线
gl.drawElements( gl.TRIANGLES, numVertices, gl.UNSIGNED_SHORT, 0 );
您将能够使用最大 65535 的索引
要使用超过 65535 个顶点,您需要停止使用索引并使用 gl.drawArrays
或者您可以检查并启用 OES_element_index_uint
扩展,然后使用 Uint32Array
和 gl.UNSIGNED_INT
并使用最多 4294967296 的索引(尽管内存可能不足以容纳 40 亿个顶点😉)
关于javascript - 使用 WEBGL 构建 3D 形状时,JS 数组是否有限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60740156/