美文网首页GIS相关
1、什么是webgl

1、什么是webgl

作者: 晨钟暮鼓_7bc3 | 来源:发表于2019-03-26 10:54 被阅读0次

    WebGL是一项用来在网页上绘制和渲染复杂三维图形(3D图形),并允许用户与之交互的技术。Webgl技术结合了HTML5和JavaScript,允许开发者在网页上创建和渲染三维图形。

    以前桌面程需要使用C或者C++等语言,借助专门的计算机图形库(Opengl或Direct3D),来开发三维程序,随着浏览器的强大以及HTML5的出现,得以让3D在网页上实现。webgl是基于OpenGL ES技术。opengl核心的一项特性就是可编程着色器方法

    image.png

    WebGL 程序结构

    image

    WebGL是利用HTML5的canvas标签作为绘制舞台的,如果没有webgl的加持,canvas只能绘制2维图形,有了webgl,那就不一样了,就可以绘制更加逼真的3维图形。

    HTML5的canvas 标签用于绘制图像(通过脚本,通常是 JavaScript)。不过,canvas 元素本身并没有绘制能力(它仅仅是图形的容器)必须使用脚本来完成实际的绘图任务。getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。

    来一段代码先看看如何在这块画布canvas上绘制图形。下面就绘制了一个矩形.

    
    <!DOCTYPE *html*>
    
    <html *lang*="en">
    
    <head>
    
        <meta *charset*="UTF-8">
    
        <meta *name*="viewport"*content*="width=device-width,
    
        initial-scale=1.0">
    
        <meta *http-equiv*="X-UA-Compatible"*content*="ie=edge">
    
        <title>Document</title>
    
    </head>
    
    <body>
    
        <canvas *width*="500"*height*="500" *id*="webgl"></canvas>
    
        <script>
    
            // 创建cnavas标签 得到dom对象
    
            var canvas = document.getElementById('webgl');
    
            // 获取绘制2d图形的上下文对象
    
            var ctx = canvas.getContext('2d');
    
            ctx.fillStyle = 'rgba(0, 0, 255, 1.0)'; // 设置颜色
    
            ctx.fillRect(120, 10, 150, 150) // 绘制矩形
    
        </script>
    
    </body>
    
    </html>
    
    
    image.png

    同样的我们获取到webgl的上下文对象,就可以来绘制3d图形了。显然要比2d的复杂点咯,需要借助着色器。至于着色器是什么,待后面给出详细解释。

    
    <!DOCTYPE *html*>
    
    <html *lang*="en">
    
    <head>
    
        <meta *charset*="UTF-8">
    
        <meta *name*="viewport"*content*="width=device-width,
    
        initial-scale=1.0">
    
        <meta *http-equiv*="X-UA-Compatible"*content*="ie=edge">
    
        <title>Document</title>
    
        <script *src*="./cuon-utils.js"></script>
    
    </head>
    
    <body>
    
        <canvas *width*="500"*height*="500" *id*="webgl"></canvas>
    
        <script>
    
            // 创建cnavas标签 得到dom对象
    
            var canvas = document.getElementById('webgl');
    
            // 获取webgl上下文对象
    
            var ctx = canvas.getContext('webgl');
    
            *console*.log(ctx)
    
            // ctx.fillStyle ='rgba(0, 0, 255, 1.0)';
    
            // ctx.fillRect(120, 10,150, 150)
    
            var VSHADER_SOURCE =
    
                'void main() { \n' +
    
                ' gl_Position = vec4(0.0, 0.0, 0.0, 1.0); \n' +
    
                ' gl_PointSize = 10.0; \n' +
    
                '}\n'
    
        var FSHADER_SOURCE =
    
                'void main() {\n' +
    
                ' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); \n' +
    
                '}\n'
    
            // 初始化着色器
    
            if (!initShaders(ctx,VSHADER_SOURCE, FSHADER_SOURCE)) {
    
                *console*.log('failed')
    
            }
    
            ctx.clearColor(0.0, 0.0, 1.0, 1.0) // 设置背景色
    
            ctx.clear(ctx.COLOR_BUFFER_BIT) // 清空颜色缓冲区, 相当于用定义好的背景色填充绘图区域
    
            // ctx.drawColor(0.0, 1.0,0.0, 1.0)
    
            // ctx.drawPoint(0, 0, 0,10) // 绘制点
    
            ctx.drawArrays(ctx.POINTS, 0, 1)
    
    </script>
    
    </body>
    
    </html>
    
    

    cuon-utils.js

    
    // cuon-utils.js (c) 2012 kanda and matsuda
    
    /**
    
    * Create a program object and make current
    
    * @param gl GL context
    
    * @param vshader a vertex shader program (string)
    
    * @param fshader a fragment shader program (string)
    
    * @return true, if the program object was created and successfully made current
    
    */
    
    function initShaders(gl, vshader, fshader) {
    
      var program = createProgram(gl, vshader, fshader);
    
      if (!program) {
    
        console.log('Failed to create program');
    
        return false;
    
      }
    
      gl.useProgram(program);
    
      gl.program = program;
    
      return true;
    
    }
    
    /**
    
    * Create the linked program object
    
    * @param gl GL context
    
    * @param vshader a vertex shader program (string)
    
    * @param fshader a fragment shader program (string)
    
    * @return created program object, or null if the creation has failed
    
    */
    
    function createProgram(gl, vshader, fshader) {
    
      // Create shader object
    
      var vertexShader = loadShader(gl, gl.VERTEX_SHADER, vshader);
    
      var fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fshader);
    
      if (!vertexShader || !fragmentShader) {
    
        return null;
    
      }
    
      // Create a program object
    
      var program = gl.createProgram();
    
      if (!program) {
    
        return null;
    
      }
    
      // Attach the shader objects
    
      gl.attachShader(program, vertexShader);
    
      gl.attachShader(program, fragmentShader);
    
      // Link the program object
    
      gl.linkProgram(program);
    
      // Check the result of linking
    
      var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
    
      if (!linked) {
    
        var error = gl.getProgramInfoLog(program);
    
        console.log('Failed to link program: ' + error);
    
        gl.deleteProgram(program);
    
        gl.deleteShader(fragmentShader);
    
        gl.deleteShader(vertexShader);
    
        return null;
    
      }
    
      return program;
    
    }
    
    /**
    
    * Create a shader object
    
    * @param gl GL context
    
    * @param type the type of the shader object to be created
    
    * @param source shader program (string)
    
    * @return created shader object, or null if the creation has failed.
    
    */
    
    function loadShader(gl, type, source) {
    
      // Create shader object
    
      var shader = gl.createShader(type);
    
      if (shader == null) {
    
        console.log('unable to create shader');
    
        return null;
    
      }
    
      // Set the shader program
    
      gl.shaderSource(shader, source);
    
      // Compile the shader
    
      gl.compileShader(shader);
    
      // Check the result of compilation
    
      var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
    
      if (!compiled) {
    
        var error = gl.getShaderInfoLog(shader);
    
        console.log('Failed to compile shader: ' + error);
    
        gl.deleteShader(shader);
    
        return null;
    
      }
    
      return shader;
    
    }
    
    /**
    
    * Initialize and get the rendering for WebGL
    
    * @param canvas <cavnas> element
    
    * @param opt_debug flag to initialize the context for debugging
    
    * @return the rendering context for WebGL
    
    */
    
    function getWebGLContext(canvas, opt_debug) {
    
      // Get the rendering context for WebGL
    
      var gl = WebGLUtils.setupWebGL(canvas);
    
      if (!gl) return null;
    
      // if opt_debug is explicitly false, create the context for debugging
    
      if (arguments.length < 2 || opt_debug) {
    
        gl = WebGLDebugUtils.makeDebugContext(gl);
    
      }
    
      return gl;
    
    }
    
    

    绘制效果


    image.png

    -----------参考 <<WebGL编程指南>>

    小cc: 关注公众号回复python,即可获得一套完美的python视频教程。发现更多惊喜。

    image image

    相关文章

      网友评论

        本文标题:1、什么是webgl

        本文链接:https://www.haomeiwen.com/subject/ywzwvqtx.html