Рендеринг изображения с помощью texSubImage2D в Haxe - PullRequest
1 голос
/ 16 марта 2019

Я учусь наносить изображение на холст с помощью Haxe, и я прочитал, что texSubImage2D должна быть функцией, которая мне нужна для выполнения работы.

Я прочитал некоторую документацию, найденную здесь , и подумал, что смогу реализовать то, что мне было нужно, заполнив следующие параметры:

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, является принятым параметром, поэтому я не уверен, где я ошибаюсь.

Любое руководство будет действительно оценено.

1 Ответ

1 голос
/ 16 марта 2019

Я не могу полностью воспроизвести сообщение об ошибке, которое вы получаете, я думаю, что ошибки могли бы немного улучшиться в последних версиях Haxe. В любом случае, здесь есть несколько проблем:

  • Во-первых, делая gl.RGB / gl.UNSIGNED_BYTE, вы пытаетесь получить доступ к статическим полям из экземпляра. Я действительно получаю полезную ошибку для этого:

    Невозможно получить доступ к статическому полю RGB из экземпляра класса

    В то время как другие языки допускают это, Haxe не , вам необходимо получить к ним доступ через имя класса . Чтобы это исправить, просто префикс js.html.webgl.RenderingContext.

  • Во-вторых, querySelector() возвращает обычное значение js.html.Element, которое ни одна из перегрузок не принимает. Все они хотят что-то более конкретное: VideoElement, ImageElement или CanvasElement. Таким образом, вам придется сначала разыграть его:

    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);
...