在 Haxe 中使用 texSubImage2D 渲染图像

Rendering image using texSubImage2D in Haxe

我正在学习如何使用 Haxe 将图像标记到我的 canvas 上,并且我读到 texSubImage2D 应该是我完成这项工作所需的功能。

我阅读了一些找到的文档 here 并认为我可以通过完成以下参数来实现我想要的:

void gl.texSubImage2D(target, level, xoffset, yoffset, format, type, HTMLImageElement? pixels);  

这是我所做的:

gl.texSubImage2D (cast fluid.dyeRenderTarget.writeToTexture, 0, Math.round(mouse.x), Math.round(mouse.y), gl.RGB, gl.UNSIGNED_BYTE, document.querySelector('img[src="images/myImage.jpg"]'));

但是,当我尝试构建项目时,出现以下错误:

src/Main.hx:571: characters 135-191 : js.html.Element should be Int
src/Main.hx:571: characters 135-191 : For function argument 'format'

当我返回文档时,我传递的格式 gl.RGB 是一个可接受的参数,所以我不确定我哪里出错了。

任何指导将不胜感激。

我无法完全重现您收到的错误消息,我认为这些错误在最近的 Haxe 版本中可能有所改善。总之,这里有几个问题:

  • 首先,通过执行 gl.RGB / gl.UNSIGNED_BYTE,您试图从实例访问静态字段。我实际上得到了一个有用的错误:

    Cannot access static field RGB from a class instance

    虽然其他语言允许这样做,Haxe does not,但您必须通过 class 名称 访问它们。要解决此问题,只需添加前缀 js.html.webgl.RenderingContext.

  • 其次,querySelector()returns一个普通的js.html.Elementnone of the overloads接受。他们都想要更具体的东西:VideoElementImageElementCanvasElement。所以你必须先施放它:

    var image:js.html.ImageElement = cast document.querySelector('img[src="images/myImage.jpg"]');
    
  • 最后,您需要强制转换第一个参数似乎有点可疑。即使它有效,也可能有更好的方法来使用您正在使用的包装器。

所以总而言之,应该编译以下内容:

gl.texSubImage2D(cast fluid.dyeRenderTarget.writeToTexture, 0,
    Math.round(mouse.x), Math.round(mouse.y),
    RenderingContext.RGB, RenderingContext.UNSIGNED_BYTE, image);