javascript - webGL 纹理未显示在矩形中

标签 javascript canvas webgl

我在对矩形进行纹理处理时遇到问题,该矩形显示的是黑色 Canvas ,而不是带有图像的纹理 Canvas 。

首先,我像往常一样创建 webGL 程序、附加着色器并链接 webGL 程序。

然后我在加载图像时创建纹理,如下所示:

var texture = gl.createTexture();
var image = document.createElement("img");
image.src = "https://upload.wikimedia.org/wikipedia/commons/3/3a/Saint-Gervais-les-Bains_-_Mt-Blanc_JPG01.jpg";
image.onload = function() {
    gl.bindTexture(gl.TEXTURE_2D, texture);
    // Set the parameters so we can render any size image.
    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.NEAREST);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
    // Upload the image into the texture.
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
  } 

之后,我将有关矩形顶点的信息传递到顶点着色器:

var pos = gl.getAttribLocation(program, "pos");
gl.enableVertexAttribArray(pos);
var pos_Buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, pos_Buffer);
var vertices = [-1.0, -1.0, // "left-down"
  -1.0, 1.0, // "left-top"
  1.0, -1.0, // "right-down"
  1.0, 1.0, // "right-top"
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
gl.vertexAttribPointer(pos, 2, gl.FLOAT, false, 0, 0);

最后,我通过将顶点索引传递给drawElements函数来绘制矩形:

var indexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
var indices = [0, 1, 2, 1, 2, 3];
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint8Array(indices), gl.STATIC_DRAW);
// draw triangles
gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_BYTE, 0);

There是我的问题的一个jsfiddle。
请问您不知道如何解决吗?

最佳答案

image.onload 是异步函数,您在执行该函数之前进行绘制调用(在 Canvas 上绘制时不会加载图像)。

您必须将 gl.drawElements 放入其中:

image.onload = function() { // image.onload STARTS
    gl.bindTexture(gl.TEXTURE_2D, texture);
    // Set the parameters so we can render any size image.
    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.NEAREST);
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
    // Upload the image into the texture.
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);

    // anything you want, blehblahbleh ...

    // draw on canvas
    gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_BYTE, 0);

} // image.onload ENDS

另外,是的,跨源资源调用存在问题,但我猜您通过扩展解决了这个问题(或者对于 jsfiddle 测试,您可能使用 base64 格式)。

稍微更新的示例:http://jsfiddle.net/windkiller/6cLo3890/

关于javascript - webGL 纹理未显示在矩形中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36517271/

相关文章:

javascript - Node.js - 使用 console.log 显示 mongoDB 文档(无 Shell)

javascript - IE 期望的标识符、字符串或数字(不是逗号!)

javascript - Facebook Canvas : Refused to display app in a frame because it set 'X-Frame-Options' to 'DENY'

glsl - WebGL 渲染缓冲区从着色器接收倾斜的像素值

javascript - Three.js - 一个顶点着色器,根据屏幕上像素的位置进行着色

javascript - 在 Three.js 和 WebGL 中渲染 2D SVG 时遇到问题

javascript - pixjs mousedown 事件不起作用(任何版本)

javascript - 使用 "and or"语法进行空检查

javascript - Safari 8 在使用 Canvas 时卡住

javascript - 有没有办法从 JS 中的图像手动创建 Base64code