texSubImage2D
не та функция, которую вы хотите. Вы столкнулись с тремя проблемами:
texSubImage2D
не копирует подмножество image
в текстуру GL. Он копирует всю image
поверх текстуры GL с заданным смещением.
texSubImage2D
может только изменять существующие данные текстуры и будет портиться, если только texImage2D
не был вызван первым для текстуры GL.
- Стиль вызова, который вы используете для
texSubImage2D
, ожидает массив пикселей вместо HTMLImageElement
.
Существует четыре возможных подписи для этих методов:
// These two accept the normal HTMLImageElement, etc. for the last param.
texImage2D(enum target, int level, enum internalformat, enum format,
enum type, Object object);
texSubImage2D(enum target, int level, int xoffset, int yoffset,
enum format, enum type, Object object);
// These two accept a Uint8Array[] of pixels as the last parameter, despite
// being documented as wanting an ImageData object. The only reason these
// have a width/height param is *because* they take a pixel array, and GL
// doesn't know how large the image is.
texImage2D(enum target, int level, enum internalformat, long width,
long height, int border, enum format, enum type, Object pixels);
texSubImage2D(enum target, int level, int xoffset, int yoffset,
long width, long height, enum format, enum type, Object pixels);
Чтобы создать текстуру с использованием первых 32x32 пикселей изображения, сделайте что-то вроде этого:
var spriteCanvas = document.createElement('canvas');
spriteCanvas.width = 32;
spriteCanvas.height = 32;
var spriteContext = spriteCanvas.getContext('2d');
spriteContext.drawImage(image, 0, 0);
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, spriteCanvas);