zoukankan      html  css  js  c++  java
  • WebGl 二维纹理贴图(矩形)

    效果:

    代码:

      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4     <meta charset="UTF-8">
      5     <title>WebGl  二维纹理贴图(矩形)</title>
      6 </head>
      7 <body>
      8 
      9 <canvas id="myCanvas" width="500" height="300" style='border:1px solid red'></canvas>
     10 
     11 </body>
     12 
     13 <script>
     14 
     15     window.onload = function () {
     16 
     17         //获取上下文
     18         var canvas = document.getElementById('myCanvas');
     19         var gl = canvas.getContext('webgl');
     20 
     21         //定义矩形数据 并 将其储存在缓存对象
     22         var vertices = [
     23             -0.5,0.5,0.0,    0.0,0.0,//(x,y,z)(r,g,b)分别代表坐标和颜色
     24             -0.5,-0.5,0.0,   1.0,0.0,
     25             0.5,-0.5,0.0,    0.0,1.0,
     26             0.5,0.5,0.0,     1.0,1.0,
     27         ];
     28 
     29         var indices = [3,2,1,3,1,0];
     30 
     31         var vertex_buffer = gl.createBuffer();
     32         gl.bindBuffer(gl.ARRAY_BUFFER,vertex_buffer);
     33         gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
     34 
     35         var Index_Buffer = gl.createBuffer();
     36         gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,Index_Buffer);//注意  是  ELEMENT_ARRAY_BUFFER  不是  ARRAY_BUFFER
     37         gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
     38 
     39         //创建和编译着色器程序
     40         var vertCode = 'attribute vec3 coordinates;' +
     41             'attribute vec2 texCoord;' +
     42             'varying vec2 vtexCoord;' +
     43             'void main() {' +
     44             '   gl_Position = vec4(coordinates, 1.0);' +
     45             '   vtexCoord = texCoord;' +
     46             '}';
     47         var fragCode = 'precision mediump float;' +
     48             'varying vec2 vtexCoord;' +
     49             'uniform sampler2D u_Sampler;' +
     50             'void main() {' +
     51             '   gl_FragColor = texture2D(u_Sampler, vtexCoord);' +
     52             '}';
     53 
     54         var vertShader = gl.createShader(gl.VERTEX_SHADER);
     55         gl.shaderSource(vertShader, vertCode);
     56         gl.compileShader(vertShader);
     57 
     58         var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
     59         gl.shaderSource(fragShader, fragCode);
     60         gl.compileShader(fragShader);
     61 
     62         var shaderProgram = gl.createProgram();
     63         gl.attachShader(shaderProgram, vertShader);
     64         gl.attachShader(shaderProgram, fragShader);
     65         gl.linkProgram(shaderProgram);
     66         gl.useProgram(shaderProgram);
     67 
     68 
     69         //与缓冲区对象相关联着色器程序
     70         var bytes = new Float32Array(vertices).BYTES_PER_ELEMENT;// vertices中每个元素的字节数 ,这里是 float 类型, 所以是 4 个字节
     71 
     72         var coord = gl.getAttribLocation(shaderProgram, "coordinates");
     73         gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, bytes*5, 0);
     74         gl.enableVertexAttribArray(coord);
     75 
     76         var texCoord = gl.getAttribLocation(shaderProgram, "texCoord");
     77         gl.vertexAttribPointer(texCoord, 2, gl.FLOAT, false, bytes*5, bytes*3) ;
     78         gl.enableVertexAttribArray(texCoord);
     79 
     80 
     81         //创建纹理对象并调用纹理绘制方法
     82         var texture = gl.createTexture();//创建纹理对象
     83         var u_Sampler = gl.getUniformLocation(shaderProgram,"u_Sampler");//获取u_Sampler的存储位置
     84         var image = new Image();//创建image对象
     85         image.src = "./timg.jpg";
     86         image.onload = function () {//加载纹理
     87             //纹理绘制
     88             gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,1);//对纹理图像进行y轴反转
     89             gl.activeTexture(gl.TEXTURE0);//开启0号纹理单元
     90             gl.bindTexture(gl.TEXTURE_2D,texture);//向target绑定纹理对象
     91             gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR);//配置纹理参数
     92             gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,gl.RGB,gl.UNSIGNED_BYTE,image);//配置纹理图像
     93             gl.uniform1i(u_Sampler,0);//将0号纹理传递给着色器
     94 
     95             //绘制
     96             gl.clearColor(0.0,0.0,0.0,1.0);
     97             gl.clear(gl.COLOR_BUFFER_BIT);
     98             gl.drawElements(gl.TRIANGLE_STRIP, indices.length, gl.UNSIGNED_SHORT,0);
     99 
    100         };
    101 
    102 
    103     }
    104 
    105 </script>
    106 
    107 </html>
  • 相关阅读:
    四轴PID思路整理
    STM32输入捕获TIM2四通道
    四轴和遥控器的对应
    四层板学习(二)
    四层板学习(一)布线前的准备
    冲突的处理方法
    散列表
    重设置电脑时间
    深圳销量统计源码分析
    源码分析
  • 原文地址:https://www.cnblogs.com/zhinian-/p/10631497.html
Copyright © 2011-2022 走看看