| function isPowerOf2(value) { |
| return (value & (value - 1)) == 0; |
| } |
| |
| function loadIntoTexture(gl, texture, url, complete_callback) { |
| gl.bindTexture(gl.TEXTURE_2D, texture); |
| |
| // Because images have to be download over the internet |
| // they might take a moment until they are ready. |
| // Until then put a single pixel in the texture so we can |
| // use it immediately. When the image has finished downloading |
| // we'll update the texture with the contents of the image. |
| const level = 0; |
| const internalFormat = gl.RGBA; |
| const width = 1; |
| const height = 1; |
| const border = 0; |
| const srcFormat = gl.RGBA; |
| const srcType = gl.UNSIGNED_BYTE; |
| const pixel = new Uint8Array([0, 0, 255, 255]); // opaque blue |
| gl.texImage2D( |
| gl.TEXTURE_2D, |
| level, |
| internalFormat, |
| width, |
| height, |
| border, |
| srcFormat, |
| srcType, |
| pixel |
| ); |
| |
| const image = new Image(); |
| image.onload = function () { |
| gl.bindTexture(gl.TEXTURE_2D, texture); |
| gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true); |
| gl.texImage2D( |
| gl.TEXTURE_2D, |
| level, |
| internalFormat, |
| srcFormat, |
| srcType, |
| image |
| ); |
| |
| // WebGL1 has different requirements for power of 2 images |
| // vs non power of 2 images so check if the image is a |
| // power of 2 in both dimensions. |
| if (isPowerOf2(image.width) && isPowerOf2(image.height)) { |
| // Yes, it's a power of 2. Generate mips. |
| gl.generateMipmap(gl.TEXTURE_2D); |
| //?gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); |
| //?gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR_MIPMAP_LINEAR); |
| } else { |
| // No, it's not a power of 2. Turn of mips and set |
| // wrapping to clamp to edge |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); |
| gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); |
| } |
| complete_callback(image.width, image.height); |
| }; |
| image.src = url; |
| } |
| |
| // |
| // Initialize a texture and load an image. |
| // When the image finished loading copy it into the texture. |
| // |
| export function loadTexture(gl, url, complete_callback) { |
| const texture = gl.createTexture(); |
| loadIntoTexture(gl, texture, url, complete_callback); |
| return texture; |
| } |