zoukankan      html  css  js  c++  java
  • Hello Point——WebGL

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <title>画一个点</title>
        </head>
        <body onload="main()">
            <canvas id="webgl" width="200" height="200">
            </canvas>
        </body>
        <script type="text/javascript" src="webgl01.js">
        </script>
    </html>
    function main(){
        var canvas = document.getElementById('webgl');//获得canvas元素
        
        var param = ['webgl', 'experimental-webgl', 'webkit-3d', 'moz-webgl'];
        
        var gl;
        for (var i = 0; i < param.length; i++) {
            gl = canvas.getContext(param[i]);//创建webgl context(得到画图区域)
            
            if (gl) {
                break;
            }
        }
        
        if (!gl) {
            console.log('浏览器不支持WEBGL!');
        }
        
        gl.clearColor(0.0, 0.0, 0.0, 1.0);//指定颜色
        
        gl.clear(gl.COLOR_BUFFER_BIT);//使用指定的颜色清空画图区域
        
        //编写vertex shader,vertex shader指定特性(位置、大小、颜色等)
        //gl_Position指定了点的位置,在三维空间,有XYZ三个轴的坐标,最后一个是透明度,0-1,1代表完全不透明,0则是完全透明
        //vec4,是表示一个有四个参数的向量,在WebGL中均采用此类名称,vec表示vector类别,4表示接收四个参数
        //每一个参数必须是float类型的,即要加小数点,WebGL采用严格类型,不能使用整型参数
        //gl_PointSize 定义点的大小,同样是float类型
        var vShaderSource = 'void main(){ 
    ' +
        '    gl_Position = vec4(0.0, 0.0, 0.0, 1.0); 
    ' +
        '    gl_PointSize = 10.0; 
    ' +
        '} 
    ';
        
        //编写frament shader,可以理解成对每个像素进行处理
        //gl_FragColor接收vec4类型的参数,即RGBA,RGB为三原色,最后代表透明度
        var fShaderSource = 'void main(){ 
    ' +
        '    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); 
    ' +
        '} 
    ';
        
        //其实这一段非常像C,编写源代码,编译,链接...
        var vShader = gl.createShader(gl.VERTEX_SHADER);//创建shader
        gl.shaderSource(vShader, vShaderSource);//把shader source关联到shader上
        gl.compileShader(vShader);//编译shader
        var vCompiled = gl.getShaderParameter(vShader, gl.COMPILE_STATUS);
        
        var fShader = gl.createShader(gl.FRAGMENT_SHADER);
        gl.shaderSource(fShader, fShaderSource);
        gl.compileShader(fShader);
        var fCompiled = gl.getShaderParameter(fShader, gl.COMPILE_STATUS);
        
        var program = gl.createProgram();
        gl.attachShader(program, vShader);//将编译完的vertex shader和fragment shader关联到创建的program上
        gl.attachShader(program, fShader);
        
        gl.linkProgram(program);//链接program
        var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
        
        gl.useProgram(program);
        
        gl.drawArrays(gl.POINTS, 0, 1);//第一个参数POINTS表示画点,第二个参数根据前面指定的gl_Position,从第0个元素开始,因为每个点需要三个坐标,即(0.0, 0.0, 0.0),第三个参数表示画一个
    }

    其中红色加粗的均为WebGL中的方法,为了方便理解,并未对代码结构作规划,重点在于理解WebGL。

  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/idealer3d/p/3513838.html
Copyright © 2011-2022 走看看