因为我们只用画一个矩形(其实是两个三角形),所以需要告诉WebGL矩形中每个顶点对应的纹理坐标。 我们将使用一种特殊的叫做’varying’的变量将纹理坐标从顶点着色器传到片断着色器,它叫做“可变量” 是因为它的值有很多个,WebGL会用顶点着色器中值的进行插值,然后传给对应像素执行的片断着色器。

    纹理贴图的基本使用方法

    1. function main() {
    2. var image = new Image();
    3. image.src = "http://someimage/on/our/server"; // 必须在同一域名下
    4. image.onload = function() {
    5. render(image);
    6. }
    7. }
    8. function render(image) {
    9. ...
    10. // 之前的代码
    11. ...
    12. // 找到纹理的地址
    13. var texCoordLocation = gl.getAttribLocation(program, "a_texCoord");
    14. // 给矩形提供纹理坐标
    15. var texCoordBuffer = gl.createBuffer();
    16. gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
    17. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
    18. 0.0, 0.0,
    19. 1.0, 0.0,
    20. 0.0, 1.0,
    21. 0.0, 1.0,
    22. 1.0, 0.0,
    23. 1.0, 1.0]), gl.STATIC_DRAW);
    24. gl.enableVertexAttribArray(texCoordLocation);
    25. gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
    26. // 创建纹理
    27. var texture = gl.createTexture();
    28. gl.bindTexture(gl.TEXTURE_2D, texture);
    29. // 设置参数,让我们可以绘制任何尺寸的图像
    30. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
    31. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
    32. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
    33. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
    34. // 将图像上传到纹理
    35. gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
    36. ...
    37. }