5

我正在尝试使用 JavaScript 和 Webgl 制作三角形的立方体。立方体将使用使用数组的面边缘顶点结构,但是当我使用数组时,屏幕上没有任何内容。这就是我声明数组的方式。

function Vector(x,y,z){
this.x = x; 
this.y = y;
this.z = z;
}

var V = new Array;
V[0] = new Vector(0.0,  1.0,  0.0);
V[1] = new Vector(-1.0, -1.0,  0.0);
V[2] = new Vector(1.0, -1.0,  0.0);


function initBuffers() {
    triangleVertexPositionBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
    var vertices = [
        V[0],
        V[1],
        V[2]
    ];
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
    triangleVertexPositionBuffer.itemSize = 1;
    triangleVertexPositionBuffer.numItems = 3;

如果有人可以提供帮助,我不确定为什么它不会绘制到屏幕上。

4

1 回答 1

3

问题是以下行:

gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);

new Float32Array(vertices)正在回归[NaN, NaN, NaN]。这是因为Float32Array构造函数需要一个Numbers 数组而不是一个Vectors 数组。

您需要传递snew Float32Array()的单个一维数组Number

如果要修复它,则必须编写一个函数将Vectors 数组转换为Float32Array. 像这样的东西:

function vectorsToFloatArray(vertices) {
    var numbers = [];

    for(var i = 0; i < vertices.length; i++) {
        numbers.push(vertices[i].x);
        numbers.push(vertices[i].y);
        numbers.push(vertices[i].z);
    }

    return new Float32Array(numbers);
}

并记得更新gl.bufferData()和项目大小:

    gl.bufferData(gl.ARRAY_BUFFER, vectorsToFloatArray(vertices), gl.STATIC_DRAW);
    triangleVertexPositionBuffer.itemSize = 3;
于 2012-11-30T22:44:44.007 回答