【问题标题】:WebGL - Is it possible to pass gl into an img.onload function?WebGL - 是否可以将 gl 传递给 img.onload 函数?
【发布时间】:2018-04-06 19:37:43
【问题描述】:

在我用 ES6 编写的 WebGL 程序中,我有一个名为 Texture 的类。

首先,它将纹理绘制为 1 个红色像素。图像加载后,我想用图像替换红色像素。

我有点卡住了,因为我不确定最好的方法是什么,因为它目前会引发错误并且不起作用:

未捕获的类型错误:无法在“WebGLRenderingContext”上执行“texImage2D”:未找到与提供的签名匹配的函数。

我最好的猜测是,这是因为 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);
}

但是它会抛出这个错误:

未捕获的类型错误:t.texImage2D 不是函数

【问题讨论】:

标签: javascript ecmascript-6 webgl


【解决方案1】:

您正在函数内部创建一个新范围。在 ES6 中防止它的最简单方法是箭头函数:

this.img.onload = () => {
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.img);
}

【讨论】:

  • 这太完美了,我会接受你的回答,我会读入箭头函数。
【解决方案2】:

onload 函数中的关键字 this 与您期望的 this 上下文不同。一种方法是使用箭头函数,如Sebastian Speitel 的答案。

您也可以将引用保存到self 变量中,这是一种常见的模式:

var self = this;
this.img.onload = function() {
        gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, self.img);
}

任何函数都可以从外部范围访问变量,这就是为什么 self 可以在 this.img.onload 内部访问。

【讨论】:

  • 我刚刚测试了这个,它也可以工作。感谢您的解释,虽然箭头功能是我的首选解决方案,但了解这些信息绝对有用,因为我正在学习 ES6。
  • 是的,如果可以,请使用 ES6。箭头函数没有自己的thisThis 与创建它们的上下文相关联,这在许多情况下都很有用 - 例如你的情况 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2021-07-29
  • 2015-05-11
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多