ในโปรแกรม WebGL ของฉันที่ฉันเขียนใน ES6 ฉันมีคลาสชื่อ Texture
ในตอนแรกจะวาดพื้นผิวเป็น 1 พิกเซลสีแดง เมื่อรูปภาพโหลดแล้ว ฉันต้องการแทนที่พิกเซลสีแดงด้วยรูปภาพ
ฉันติดขัดเล็กน้อยเนื่องจากไม่แน่ใจว่าวิธีที่ดีที่สุดสำหรับสิ่งนี้เนื่องจากขณะนี้เกิดข้อผิดพลาดและไม่ได้ผล:
Uncaught TypeError: ไม่สามารถดำเนินการ 'texImage2D' บน 'WebGLRenderingContext': ไม่พบฟังก์ชันที่ตรงกับลายเซ็นที่ให้ไว้
ฉันเดาได้ดีที่สุดว่าสิ่งนี้เกิดขึ้นเนื่องจาก JavaScript เป็นแบบอะซิงโครนัส ดังนั้นเมื่อรูปภาพโหลดแล้ว gl หายไป หรือบางทีฉันอาจคิดผิดเกี่ยวกับเรื่องนี้
การช่วยให้เข้าใจสิ่งนี้และ/หรือแนวทางแก้ไขจะได้รับการชื่นชมอย่างมาก
export default class Texture {
constructor(gl, src) {
// create texture then bind it
this.texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, this.texture);
// texture settings for the texture
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
// create it as a red pixel first so it can be quickly drawn then replaced with the actual image
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));
// active the texture
gl.activeTexture(gl.TEXTURE0);
// load the image
this.img = new Image();
this.img.src = src;
// replace the red pixel with the texture once it is loaded
this.img.onload = function() {
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.img);
}
}
}
ฉันลองสิ่งนี้แล้ว:
this.img.onload = function(gl) {
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.img);
}
แต่มันเกิดข้อผิดพลาดนี้:
Uncaught TypeError: t.texImage2D ไม่ใช่ฟังก์ชัน