texSubImage2D
不是你想要的功能。您遇到三个问题:
texSubImage2D
不会将image
的子集复制到GL纹理中。它将GL纹理顶部的整个image
复制到给定的偏移量。
texSubImage2D
只能修改现有的纹理数据,并且会混乱起来,除非首先为GL纹理调用texImage2D
。
- 您用于
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);
要使用图像的第一32×32像素创建纹理,做这样的事情,而不是:
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);
注:我说那些采取'Uint8Array []'。这不完全正确:他们接受一个类型数组,但类型取决于调用的'type'参数的值。 – 2011-03-16 16:45:19
完美地工作,谢谢。我认为我不得不在GL本身做,但使用标准的HTML元素对我来说更容易。 – Nick 2011-03-16 18:20:54