WebGL画一个彩色矩形

2026-05-02 10:37:52 251
分类:WebGL

转载自:https://blog.csdn.net/qq_37338983/article/details/73742119

        今天和大家分享一个用WebGL画矩形(rectangle)的小Demo,也可用来绘制三角形(triangle)。本文适用于初学者掌握WebGL的基本绘图知识,WebGL是OpenGL的Web版本,所以它的绘图过程与OpenGL是一样的,这里不赘述,大家自行百度。

        今天分享的是绘制一个二维的图形--矩形;二维是三维的基础,二维图像的Z=0,由此,先掌握二维图像的绘制,再向三维拓展,自然水到渠成。废话不多说,直接进入正题。

        首先,webgl不能直接画彩色矩形的,但webgl可以直接画三角形,画三角形有三种画法,分别是:gl.TRIANGLES、gl.TRIANGLE_STRIP、gl.TRIANGLE_FAN,如下图所示。

        本文用到的的是第二种绘制三角形的方法gl.TRIANGLE_STRIP,一定要特别注意,其绘制的顶点顺序为(v0,v1,v2),(v2,v1,v3),由此得到两个三角形拼凑成一个矩形。详细过程示意图如下图:

        第三种方法gl.TRIANGLE_FAN也可以达到目的,但顶点的顺序要稍微调整一下,(v0,v1,v2),(v0,v2,v3)。程序运行结果如下图:

上面是相关原理和运行结果,接下来直接上代码:

triangle.js

 * Created by wjh on 2017/6/26. 
 */  
  
var canvas;  
var gl;  
  
function init(){  
    canvas = document.getElementById("Rectangle");//获取canvas元素  
    gl = WebGLUtils.setupWebGL(canvas);  
    //判断浏览器是否支持webgl  
    if(!gl){  
        alert("您的浏览器不支持WebGL!")  
    }  
  
    //矩形的定点数组,共4个(x,y,r,g,b)  
    var verticescolor = new Float32Array([  
        -0.5,0.0, 0.0,1.0,0.0,  
        0.0,-0.5, 0.0,0.0,1.0,//r,g,b,为颜色信息  
        0.0,0.5, 1.0,0.0,0.0,  
        0.5,0.0, 0.0,0.0,0.0  
    ]);  
  
    //顶点顺序索引  
    var indexV = new Uint8Array([  
        0,1,2,  
        2,1,3  
    ]);  
  
    //设置窗口大小  
    gl.viewport(0,0,canvas.width,canvas.height);  
    gl.clearColor(0.0,0.0,0.0,1.0);  
  
    //初始化着色器  
    var program = initShaders(gl,"v-shader","f-shader");  
    gl.useProgram(program);  
  
    //创建缓存  
    var tBuffer = gl.createBuffer()//为矩形顶点创建的缓存  
    var iBuffer = gl.createBuffer();//为顶点索引创建的缓存  
  
    gl.bindBuffer(gl.ARRAY_BUFFER,tBuffer);//绑定缓冲区  
    gl.bufferData(gl.ARRAY_BUFFER,flatten(verticescolor),gl.STATIC_DRAW);//向缓冲区写入顶点数据  
  
    //获取顶点着色器中attribute变量位置  
    var a_Position = gl.getAttribLocation(program,"a_Position");  
  
    var SIZE = verticescolor.BYTES_PER_ELEMENT;  
    //建立a_Position与顶点着色器attribute变量“a_Position”的关联  
    gl.vertexAttribPointer(a_Position,2,gl.FLOAT,false,SIZE*5,0);  
    gl.enableVertexAttribArray(a_Position);  
  
    var a_Color = gl.getAttribLocation(program,"a_Color");  
    gl.vertexAttribPointer(a_Color,3,gl.FLOAT,false,SIZE*5,SIZE*2);  
    gl.enableVertexAttribArray(a_Color);  
  
    gl.bindBuffer(gl.ARRAY_BUFFER,iBuffer);//绑定缓冲区  
    gl.bufferData(gl.ARRAY_BUFFER,flatten(indexV),gl.STATIC_DRAW);//向缓冲区写入索引数据  
  
  
    render();//执行画图函数  
}  
  
function render(){  
    gl.clear(gl.COLOR_BUFFER_BIT);//清除屏幕  
  gl.drawArrays(gl.TRIANGLE_STRIP,0,4)//画三角形,两个三角形拼凑成一个矩形  
  
}  
window.onload = init;//window加载init函数,最终显示矩形

html文档如下:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
    <title>Rectangle</title>
    <!--顶点着色器-->
    <script id="v-shader" type="x-shader/x-vertex">
        attribute vec4 a_Position;
        attribute vec4 a_Color;
        varying vec4 v_Color;
        void main()
        {
        gl_Position = a_Position;
        v_Color = a_Color;
        }
    </script>
    <!--片元着色器-->
    <script id="f-shader" type="x-shader/x-fragment">
        precision mediump float;
        varying vec4 v_Color;
        void main()
        {
        gl_FragColor = v_Color;
        }
    </script>
    <!--调用js文件-->
    <script type="text/javascript" src="../../libs/webgl-utils.js"></script>
    <script type="text/javascript" src="../../libs/MV.js"></script>
    <script type="text/javascript" src="../../libs/initShaders.js"></script>
    <script type="text/javascript" src="triangle.js"></script>
</head>
<body>
<!--定义canvas ID-->
<canvas id="Rectangle" width="618" height="618">
</canvas>
</body>
</html>