Текстуры не загружаются в webgl. чтение и манипулирование с 2D canvas, сохранение в массиве

#javascript #html #textures #webgl #getimagedata

#javascript #HTML #Текстуры #webgl #getimagedata

Вопрос:

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

Я добиваюсь этого, рисуя изображения на 2D-холсте, а затем считывая обратно пиксели. После пары рекурсий я получаю желаемое изображение и записываю его, используя кодировку base64 (и PNGlib.js библиотека) обратно в массив.

проблема в том, что все текстуры остаются черными при загрузке страницы. Это так, пока я вручную не перезагружу страницу.

http://home.scarlet.be /~cornetp/ (тестировалось только в firefox 4)

Я хочу, чтобы изображения отображались немедленно, если кто-нибудь мог бы взглянуть на это,

Спасибо,

     var crateTextures = Array();
    var crateArray = Array();
    var imageArray = Array();
    var crateImage
    var elem;
    var context;
    var r;
    var g;
    var b;

    function initTexture() {            
            cratefunction();
            for (var t=0; t < 3; t  ) {
            var texture = gl.createTexture();
            texture.image = crateArray[t];
            crateTextures.push(texture);            
        }

        crateArray[0].onload = function () {
            handleLoadedTexture(crateTextures)
        }

    }
    function cratefunction(){
        initImages();
        toSagitaal();   
    }   
    function toSagitaal(){
        elem = document.getElementById('myCanvas');
        context = elem.getContext('2d');
        for(var z=0; z<3; z  ){
            context.drawImage(imageArray[z], 0, 0);

            var p = new PNGlib(256, 256, 256); // construcor takes height, weight and color-depth
            var background = p.color(1, 1, 0, 1); // set the background transparent
            var canvasData = context.getImageData(0, 0, elem.width, elem.height);
            for (var i = 0; i < 256; i  ) {
                    for (var j = 0; j < 256; j  ) {
                            var idx = (j * canvasData.width   i) * 4;
                                r = canvasData.data[idx   0];
                                g = canvasData.data[idx   1];                           
                                b = canvasData.data[idx   2];                           
                                p.buffer[p.index(255-i, j   0)] = p.color(r, g, b);
                    }
            }
        crateImage = new Image();
        crateImage.src = "data:imagef/png;base64," p.getBase64();
        crateArray.push(crateImage);        
        }
    }   
    function initImages() {
                imageArray[0] = new Image();
        imageArray[0].src = "./data/data0000.png";
                imageArray[1] = new Image();
        imageArray[1].src = "./data/data0001.png";
                imageArray[2] = new Image();
        imageArray[2].src = "./data/data0002.png";
    }
  

Ответ №1:

Ваша проблема в том, что, например, строка

    imageArray[0].src = "./data/data0000.png";
  

инициирует загрузку изображения, но не ожидает ее. Поэтому, когда вы немедленно вызываете toSagitaal() , изображения еще не загружены.

Обычно вам приходится указывать обработчик, который что-то делает при загрузке изображения. Для этого onload свойству присваивается функция.

Если вы проведете рефакторинг, чтобы у вас был function toSagitaal(i) , который обрабатывает i-е изображение, тогда вы могли бы добавить строку типа

    imageArray[0].onload = function(){toSagitaal(0);} ;
  

после imageArray[0].src присвоения и аналогично для двух других изображений.

Причина, по которой ваш нынешний пример работает при перезагрузке, заключается в том, что браузер к тому времени уже загрузил изображения, поэтому тот факт, что вы не ждете, не имеет значения.