Печать изображения в приложение на основе красителя - PullRequest
2 голосов
/ 16 марта 2019

Я изучаю динамику жидкости (и Хейкс), и наткнулся на этот удивительный проект и подумал, что постараюсь расширить его, чтобы помочь мне учиться.Демонстрацию оригинального проекта в действии можно увидеть здесь .

Пока что я создал боковое меню из предметов, содержащих разные формы.Когда пользователь нажимает на одну из фигур, а затем нажимает на холст, выбранное изображение должно быть отпечатано на красителе.Затем пользователь будет двигать мышь и исследовать искусство и т. Д.

Чтобы попытаться добиться этого, я сделал следующее:

import js.html.webgl.RenderingContext;

function imageSelection(): Void{        

    document.querySelector('.myscrollbar1').addEventListener('click', function() {
    // twilight image clicked
    closeNav(); 
    reset(); 
    var image:js.html.ImageElement = cast document.querySelector('img[src="images/twilight.jpg"]');
    gl.current_context.texSubImage2D(cast fluid.dyeRenderTarget.writeToTexture, 0, Math.round(mouse.x), Math.round(mouse.y), RenderingContext.RGB, RenderingContext.UNSIGNED_BYTE, image);
    TWILIGHT = true;  

});

После этого вызова внутри функции обновления у меня естьследующее:

override function update( dt:Float ){

        time = haxe.Timer.stamp() - initTime;
        performanceMonitor.recordFrameTime(dt);
        //Smaller number creates a bigger ripple, was 0.016
        dt = 0.090;//@!
        //Physics
        //interaction
        updateDyeShader.isMouseDown.set(isMouseDown && lastMousePointKnown);
        mouseForceShader.isMouseDown.set(isMouseDown && lastMousePointKnown);

        //step physics
        fluid.step(dt);

        particles.flowVelocityField = fluid.velocityRenderTarget.readFromTexture;

        if(renderParticlesEnabled){
            particles.step(dt);
        }

//Below handles the cycling of colours once the mouse is moved and then the image should be disrupted into the set dye colours.

}

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

WebGL: INVALID_ENUM: texSubImage2D: недопустимая цель текстуры

Безопасно ли предполагать, что мое приведение дляпервый параметр не допускается?

Я прочитал, что текстурная цель является первым параметром, а INVALID_ENUM, в частности, означает, что один из параметров gl.XXX просто некорректен для этой конкретной функции.

Просмотр файла writeToTexture объявлен так: public var writeToTexture (default, null):GLTexture;.WriteToTexture - это обертка вокруг обычного дескриптора webgl.

Я использую Haxe version 3.2.1 и Snow для сборки проекта.WriteToTexture определяется внутри HaxeToolkit\haxe\lib\gltoolbox\git\gltoolbox\render

1 Ответ

3 голосов
/ 16 марта 2019

writeToTexture в gltoolbox - это GLTexture. С snow и snow_web это определяется в snow.modules.opengl.GL как:

typedef GLTexture = js.html.webgl.Texture;

Итак, мы просто имеем дело с js.html.webgl.Texture здесь или WebGLTexture в нативном JS.

Это означает, что да, это определенно недопустимое значение для texSubImage2D() target, , которое определено как принимающее одну из gl.TEXTURE_* констант .

A GLenum с указанием точки привязки (цели) активной текстуры.

Из этого описания очевидно, что параметр фактически не относится к самой текстуре - он просто дает некоторую информацию о , как должна использоваться активная текстура.

Тогда возникает вопрос, как можно установить «активную» текстуру. bindTexture() может использоваться для этого.

...