ale*_*lex 16 javascript html5 textures canvas webgl
我成功地从图像创建了一个WebGL纹理并将其绘制到一个canvas元素中.
function initTexture(src) {
texture = gl.createTexture();
texture.image = new Image();
texture.image.onload = function() {
handleLoadedTexture(texture)
}
texture.image.src = src;
}
Run Code Online (Sandbox Code Playgroud)
我还试图从这些数据类型之一创建纹理,但没有成功.
是否可以使用图像的像素阵列创建纹理?或者换句话说:是否可以从像素数组中创建JS Image对象?
编辑:
像素阵列看起来像这样[r,g,b,a,r,g,b,a,r,g,b,a,...],每个值的范围为{0..255}.我想用给定数组中的像素创建纹理.
Toj*_*oji 34
使用像素阵列创建纹理绝对是可能的!我一直在我的代码中使用以下代码来创建单个像素,纯色纹理.
function createSolidTexture(gl, r, g, b, a) {
var data = new Uint8Array([r, g, b, a]);
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
return texture;
}
Run Code Online (Sandbox Code Playgroud)
编辑:要进一步推断这一点,你需要知道的大部分内容都在gl.texImage2d通话中.要从原始RGB(A)数据创建纹理,您需要一个无符号字节值数组,您需要向WebGL指定数据所代表的内容(RGB或RGBA),并且您需要知道纹理的尺寸.更通用的函数看起来像这样:
function textureFromPixelArray(gl, dataArray, type, width, height) {
var dataTypedArray = new Uint8Array(dataArray); // Don't need to do this if the data is already in a typed array
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.texImage2D(gl.TEXTURE_2D, 0, type, width, height, 0, type, gl.UNSIGNED_BYTE, dataTypedArray);
// Other texture setup here, like filter modes and mipmap generation
return texture;
}
// RGB Texture:
// For a 16x16 texture the array must have at least 768 values in it (16x16x3)
var rgbTex = textureFromPixelArray(gl, [r,g,b,r,g,b...], gl.RGB, 16, 16);
// RGBA Texture:
// For a 16x16 texture the array must have at least 1024 values in it (16x16x4)
var rgbaTex = textureFromPixelArray(gl, [r,g,b,a,r,g,b,a...], gl.RGBA, 16, 16);
Run Code Online (Sandbox Code Playgroud)