javascript - 使用 WEBGL 构建 3D 形状时,JS 数组是否有限制?

标签 javascript webgl

我一直在尝试构建 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扩展,然后使用 Uint32Arraygl.UNSIGNED_INT 并使用最多 4294967296 的索引(尽管内存可能不足以容纳 40 亿个顶点😉)

关于javascript - 使用 WEBGL 构建 3D 形状时,JS 数组是否有限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60740156/

相关文章:

javascript - 在一个 div 中获取指定的文本,而不是在不同的 div 中搜索它们

javascript - 填充功能

javascript - 如何在 Three.js 中用 ShaderMaterial 替换 Collada 导入的纹理?

javascript - 为什么我的代码没有获取 JSON 值?

javascript - TinyMCE 从可视选项卡上的链接中剥离 JavaScript

javascript - 刷新时宽度数组发生变化

javascript - 使用 WebGL 索引缓冲区绘制网格

javascript - 在 three.js 中使用基本纹理 Material 时出现异常抗锯齿

javascript - 仅传递三 Angular 形边长就足以在 WebGL 中绘制三 Angular 形吗?

javascript - WebGL:重用 Canvas 时重用资源