альтернатива элементу DOM ‘new Image ()’ реализации браузера в headless-gl javascript?

#node.js #image #browser #webgl

#node.js #изображение #браузер #webgl

Вопрос:

В настоящее время я использую код реализации браузера на основе WebGL на стороне клиента. Он работает отлично. Но я хочу использовать тот же код на стороне сервера. Да, это не браузерный, чистый код javascript с использованием оболочки headless-gl.

При этом я сталкиваюсь с проблемой.

новое Image() идентифицируется браузером, но на стороне сервера я получаю сообщение об ошибке Image is not defined .

В node-WebGL его можно использовать как

*var Image = require("node-webgl").Image;* ,

но в headless-gl я пытался с

*require("gl").Image; * и *require('gl')(width, height, { preserveDrawingBuffer: true }).Image* .

С вышеизложенным у меня не было никакого успеха. Может кто-нибудь предложить какое-нибудь объяснение или совет о том, где следует искать руководство по headless-gl?

Комментарии:

1. Readme может github.com/stackgl /…

Ответ №1:

Headless-gl предоставляет только WebGL. Он не обеспечивает загрузку изображений, которые сами по себе не являются частью WebGL, изображения являются частью HTML5

Вы могли бы попробовать пакет images

Для загрузки и получения данных должно работать что-то вроде этого

 var images = require('images');
var img = images('/path/to/img.jpg');
var raw = img.toBuffer(images.TYPE_RAW);
var pixels = new Uint8Array(raw.buffer, 12); // skip the raw header
  

Теперь вы можете загрузить изображение

 gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, img.width(), img.height(),
              0, gl.RGBA, gl.UNSIGNED_BYTE, pixels);
  

Или создайте оболочку для эмуляции WebGL API для изображений

 gl.texImage2D = function(origFn) {
  return function(bind, mip, internalFormat) {
     var width;
     var height;
     var border;
     var format;
     var type;
     var data;
     if (arguments.length === 9) {
       // sig1: bind, mip, internalFormat, width, height, border, format, type, data
       width = arguments[3];
       height = arguments[4];
       border = arguments[5];
       format = arguments[6];
       type = arguments[7];
       data = arguments[8];
     } else if (arguments.length === 6) {
       // sig2: bind, mip, internalFormat, format, type, image
       format = arguments[3];
       type = arguments[4];
       img = arguments[6];
       var raw = img.toBuffer(images.TYPE_RAW);
       data = new Uint8Array(raw.buffer, 12); // skip the raw header           
       width = img.width();
       height = img.height();
       border = 0;
     } else {
       throw "Bad args to texImage2D";
     }
     gl.texImage2D(bind, mip, internalFormat, width, height, 
                   border, format, type, data);
  };
}(gl.texImage2D);
  

Комментарии:

1. Да, я пытался. Сначала передано как 6 параметров, но я получил ошибку. И затем я попробовал как 9 параметров. Это сработало. Но после внесения изменений появляется ошибка при undefined:282 gl.vertexAttribPointer(gl.ShaderProgram.vertexPositionAttribute, cube. VertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0); ^ Ошибка типа: не удается прочитать свойство ‘vertexPositionAttribute’ null в DrawCube (вычисляется в <anonymous> …

2. Cannot read property 'vertexPositionAttribute' of null at drawCube означает, что объект, который, по вашему мнению, содержался vertexPositionAttribute , равен null. Этот объект gl.shaderProgram . gl.shaderProgram это то, что вы придумали. Это не часть WebGL. Это ваш собственный код.

3. Да, теперь я понял. Извините за это. Шейдеры не загружаются. запрос 404. Я изучаю это. 🙂