doubleyong
管理员
管理员
  • 最后登录2026-05-25
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:6410回复:0

[html]WebGL简介

楼主#
更多 发布于:2020-01-10 14:59
背景:
很多时候大家会听到做webGL项目,但是很多同学对于WebGL不太了解,下面就简单介绍一下

一、WebGL概念(来自MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/WebGL_API
WebGL (Web图形库) 是一种JavaScript API,用于在任何兼容的Web浏览器中呈现交互式3D和2D图形,而无需使用插件。WebGL通过引入一个与OpenGL ES 2.0紧密相符合的API,可以在HTML5 <canvas> 元素中使用。

目前支持 WebGL 的浏览器有:Firefox 4+, Google Chrome 9+, Opera 12+, Safari5.1+ 和 Internet Explorer 11+;然而, WebGL一些特性也需要用户的硬件设备支持。


二、WebGL和传统网页的区别:

普通网页组成成分:HTML、JavaScript;
WebGL网页组成成分:HTML5、JavaScript和GLSL ES(着色器语言 OpenGL ES)


三、WebGL示例
WebGL采用H5中的<canvas>元素来定义绘图区域,然后通过JavaScript内嵌GLSL ES在canvas中绘制三维图形

canvas可以同时支持二维图形和三维图形,它不直接提供绘图方法,而是提供一种叫上下文(context)机制来绘制图形,
3.1使用canvas绘制webgl步骤:
  3.1.1创建HTML5 canvas
&lt;canvas id="canvas" width="200px" height="200px"&gt;&lt;/canvas&gt;

  3.1.2获取画布 canvas 的 ID
//获取canvas元素
var canvas = document.getElementById('canvas');

  3.1.3获取WebGL
//获取webgl上下文
var gl = canvas.getContext('webgl');
解释:为了得到 WebGLRenderingContext 对象(或图形的WebGL上下文对象或只在WebGL的情况下),调用当前 HTMLCanvasElement 的getContext()方法。getContext()的语法如下  :
canvas.getContext(contextType, contextAttributes);
通过"webgl"字符串或"experimental-webgl" 作为 contentType。contextAttributes参数是可选的。 (虽然在进行这一步,请确保您的浏览器实现了WebGL 1.0版本(OpenGL ES 2.0))。其中WebGL的参数 ContextAttributes 不是强制性的。此参数提供接受布尔值,具体参数可以查看官方手册。

3.1.4编译着色器
  着色器参考:http://www.yiibai.com/webgl/webgl_shaders.html
完整代码:
html:
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta lang="en"&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;title&gt;WebGL study&lt;/title&gt;
    &lt;link href="style/style.css"&gt;
    &lt;script type="text/javascript" src="js/js.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;canvas id="canvas" width="200px" height="200px"&gt;&lt;/canvas&gt;
&lt;/body&gt;
&lt;/html&gt;
javascript:
/**
 * Created by houbingshuai on 2016/12/3.
 */
window.onload = function () {
    //顶点着色器程序
    var VSHADER_SOURCE =
        "void main() {" +
            //设置坐标
        "gl_Position = vec4(0.0, 0.0, 0.0, 1.0); " +
            //设置尺寸
        "gl_PointSize = 10.0; " +
        "} ";
    //片元着色器
    var FSHADER_SOURCE =
        "void main() {" +
            //设置颜色
        "gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);" +
        "}";
    //获取canvas元素
    var canvas = document.getElementById('canvas');
    //获取绘制二维上下文
    var gl = canvas.getContext('webgl');
    if (!gl) {
        console.log("Failed");
        return;
    }
    //编译着色器
    var vertShader = gl.createShader(gl.VERTEX_SHADER);
    gl.shaderSource(vertShader, VSHADER_SOURCE);
    gl.compileShader(vertShader);
    var fragShader = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(fragShader, FSHADER_SOURCE);
    gl.compileShader(fragShader);
    //合并程序
    var shaderProgram = gl.createProgram();
    gl.attachShader(shaderProgram, vertShader);
    gl.attachShader(shaderProgram, fragShader);
    gl.linkProgram(shaderProgram);
    gl.useProgram(shaderProgram);
    //绘制一个点
    gl.drawArrays(gl.POINTS, 0, 1);
}
参考:https://www.cnblogs.com/bsman/p/6128447.html
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号