我是Javascript的新手,我正在玩WebGL并收到错误"self.starshipVertexPositionBuffer is undefined"
。在尝试访问itemSize属性时,看起来它正在崩溃(请参阅下面的注释),但是在进行该语句之前,它正在被初始化(请参阅下面的注释),所以我不明白为什么它会因为该错误而崩溃。你的想法?
var starship;
function initstarship()
{
starship = new starship();
starship.initBuffers();
}
function starship()
{
this.angle = 0;
this.speed = 0;
this.xDir = 0;
this.yDir = 0;
this.xPos = 0.0;
this.yPos = 0.0;
this.starshipVertexPositionBuffer = null;
this.starshipVertexTextureCoordBuffer = null;
this.starshipVertexIndexBuffer = null;
}
starship.prototype.updatePosition = function(timeElapsed){
this.xPos += this.xDir * this.speed;
this.yPos += this.yDir * this.speed;
}
starship.prototype.initBuffers = function () {
this.starshipVertexPositionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, this.starshipVertexPositionBuffer);
vertices = [
-0.15, -0.15, 0.15,
0.15, -0.15, 0.15,
0.15, 0.15, 0.15,
-0.15, 0.15, 0.15,
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
//INITIALIZED HERE
this.starshipVertexPositionBuffer.itemSize = 3;
this.starshipVertexPositionBuffer.numItems = 4;
this.starshipVertexTextureCoordBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, this.starshipVertexTextureCoordBuffer);
var textureCoords = [
0.0, 0.0,
1.0, 0.0,
1.0, 1.0,
0.0, 1.0,
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoords), gl.STATIC_DRAW);
this.starshipVertexTextureCoordBuffer.itemSize = 2;
this.starshipVertexTextureCoordBuffer.numItems = 4;
this.starshipVertexIndexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.starshipVertexIndexBuffer);
var starshipVertexIndices = [
0, 1, 2, 0, 2, 3,
]
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(starshipVertexIndices), gl.STATIC_DRAW);
this.starshipVertexIndexBuffer.itemSize = 1;
this.starshipVertexIndexBuffer.numItems = 6;
}
starship.prototype.draw = function()
{
mvPushMatrix();
mat4.translate(mvMatrix, [this.xPos, this.yPos, z]);
mat4.rotate(mvMatrix, degToRad(this.angle), [0, 0, 1]);
gl.bindBuffer(gl.ARRAY_BUFFER, self.starshipVertexPositionBuffer);
//CRASHING ON THIS NEXT LINE
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, self.starshipVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
gl.bindBuffer(gl.ARRAY_BUFFER, self.starshipVertexTextureCoordBuffer);
gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, self.starshipVertexTextureCoordBuffer.itemSize, gl.FLOAT, false, 0, 0);
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, starshipTexture);
gl.uniform1i(shaderProgram.samplerUniform, 0);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.starshipVertexIndexBuffer);
setMatrixUniforms();
gl.drawElements(gl.TRIANGLES, self.starshipVertexIndexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
mvPopMatrix();
}
function webGLStart() {
initstarship();
tick();
}
非常感谢你的智慧!