Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WebGL,真正进入三维的世界

WebGL,真正进入三维的世界

原创
作者头像
周明礼
修改于 2017-06-19 10:58:26
修改于 2017-06-19 10:58:26
8.9K21
代码可运行
举报
文章被收录于专栏:周明礼的专栏周明礼的专栏
运行总次数:1
代码可运行

一、在此之前

在之前的文章中,我想大家已经对WebGL有了一个大体的了解,不过为了凑字数,我在这篇文章的开头再稍微回顾一下,如果我们需要使用WebGL来绘制图像需要走完以下这五步:

1、从canvas元素中获取webgl context

2、利用GLSL ES语言,编写顶点着色器和片元着色器,并成对应的着色器程序

3、准备好你想要绘制的图像的顶点数据,并写入缓冲区

4、把着色器中的变量与载有顶点数据的缓冲区对应起来

5、最后执行着色器程序,并在canvas上绘制出图形

当然,并不是说所有的WebGL程序都必须按这样的逻辑进行,这里只是让大家对WebGL有一个基本的概念,而那些项目中使用到的真正的WebGL程序要比这复杂得多。

为了使得我们能集中精力去编写那些酷炫的WebGL程序,我把上面这些基本的步骤封装在几个工具类中,大家只要在页面里引入附件中的gl-core-min.js即可。在gl-core文件中,第一个提供给大家使用的是Program类,用于创建和管理着色器程序,具体使用如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code" style="text-align: left;">

    var program = new Program(gl);

    // 载入顶点着色器
    program.attach(VERTEX_SHADER_SOURCE, gl.VERTEX_SHADER);
    // 载入片元着色器
    program.attach(FRAGMENT_SHADER_SOURCE, gl.FRAGMENT_SHADER);
    program.link();
    program.bind();

</div>

第二个提供给大家使用的是Buffer类,用于创建和管理数据缓冲区,具体使用如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code" style="text-align: left;">

    // 创建顶点数据缓冲区
    var vertexBuffer = new Buffer(gl, gl.ARRAY_BUFFER);

    // 向缓存区写入数据
    vertexBuffer.write(modelObject.vertex, gl.STATIC_DRAW);
    // 是缓冲区中的数据和着色器中的a_VertexPosition变量对应起来
    vertexBuffer.bind(programAttribs.a_VertexPosition, 3, gl.FLOAT);

</div>

除此以外,由于三维图形绘制还会涉及到大量的矩阵或向量运算,我们需要一些数学工具辅助我们的开发,这里给大家介绍一个库——gl-matrix(http://glmatrix.net/)。同样,大家只要在页面里引入附件中的gl-matrix-min.js即可。这里给大家演示一下gl-matrix的基本用法,详细的可以参考官网上的文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code" style="text-align: left;">

    // 创建4x4矩阵
    var viewMatrix = mat4.create();

    // 对矩阵进行转置
    mat4.transpose(viewMatrix, viewMatrix);
    // 对矩阵进行求反
    mat4.invert(viewMatrix, viewMatrix);

    // 创建1x3向量
    var positionVector = vec3.create();

    // 对向量进行规范化
    vec3.normalize(positionVector, positionVector);

</div>

有了这些工具,我们就可以开始讲解今天的主题了,使用WebGL绘制三维图形。

二、从2D到3D

在之前的例子中,我只是给大家演示了如何绘制一个二维的矩形,但WebGL真正强大的地方,在于它为我们提供了三维图像的绘制能力。当然这主要的得益于WebGL的计算速度,要知道,绘制三维图形,我们需要进行大量的(逐顶点甚至是逐片元)的矩阵运算,而且这些运算都必须在16ms内完成,才能保证画面的流畅。如果是直接使用Canvas 2D Api绘制三维图像,所有这些运算,只能在CPU中完成。而通过WebGL,这些耗时的运算就可以直接交给GPU,通过GPU中一些专用的硬件,使得运算的过程得到优化(管线,并行)。

说了那么多,那到底我们怎样才能绘制出一个三维图形呢?要绘制出三维图像,我们首先要知道三维图像和二维图像有那些区别。

从上面这幅图,我们可以比较直观的看到一个正方形到立方体的演变过程,主要经历了以下四步:

1、给图像加入深度信息,也就是让这个正方形有了厚度,从一个“面”成为一个“体”

2、换一个角度去观察我们的场景(45度俯瞰),这使得深度信息在视觉上得到了体现

3、光有深度信息还不够,我们观察三维图像一般是带透视的,这样图像更有立体感

4、最后我们需要在场景中加入灯光,灯光下的立方体更加真实

这样我们就有了一个大致的方向,为了绘制三维图形,我们需要一下四部分信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code" style="text-align: left;">

    // 获取立方体的顶点数据,包含深度信息(即z轴坐标)
    var modelObject = getCubeVertexData();

    // 获取视图变换矩阵,用来模拟摄像机在不同角度的拍摄
    var viewMatrix = getCameraMatrix();

    // 获取透视变换矩阵,用来模拟现实中近大远小的透视效果
    var projectMatrix = getPerspectiveMatrix();

    // 获取灯光数据,这里得到的是一个点光源,类似白炽灯
    var pointLight = getPositionalLight();

</div>

接下来,我就带着大家一步一步来完成各个方法的功能开发,首先是getCubeVertexData方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code" style="text-align: left;">

    function getCubeVertexData() {
        var width = 4,
            height = 4,
            depth = 4;

        var w = width / 2,
            h = height / 2,
            d = depth / 2;

        // 顶点数据,三个坐标(x, y, z)组成一个顶点
        // 每个面有4个点,总共是4x6,24个顶点坐标
        var vertices = new Float32Array([
            -w, h, d,   w, h, d,  -w,-h, d,   w,-h, d, // 0-1-2-3     // front
             w, h,-d,  -w, h,-d,   w,-h,-d,  -w,-h,-d, // 4-5-6-7     // back
            -w, h,-d,  -w, h, d,  -w,-h,-d,  -w,-h, d, // 8-9-10-11   // left
             w, h, d,   w, h,-d,   w,-h, d,   w,-h,-d, // 12-13-14-15 // right
            -w, h,-d,   w, h,-d,  -w, h, d,   w, h, d, // 16-17-18-19 // top
            -w,-h, d,   w,-h, d,  -w,-h,-d,   w,-h,-d  // 20-21-22-23 // bottom
        ]);

        // 法线方向,三个坐标(x, y, z)组成一条法线
        // 例如 [0, 0, 1] 代表指向z轴正方向,长度为1的法线
        var normals = new Float32Array([
             0, 0, 1,   0, 0, 1,   0, 0, 1,   0, 0, 1, // 0-1-2-3     // front 
             0, 0,-1,   0, 0,-1,   0, 0,-1,   0, 0,-1, // 4-5-6-7     // back
            -1, 0, 0,  -1, 0, 0,  -1, 0, 0,  -1, 0, 0, // 8-9-10-11   // left
             1, 0, 0,   1, 0, 0,   1, 0, 0,   1, 0, 0, // 12-13-14-15 // right
             0, 1, 0,   0, 1, 0,   0, 1, 0,   0, 1, 0, // 16-17-18-19 // top
             0,-1, 0,   0,-1, 0,   0,-1, 0,   0,-1, 0  // 20-21-22-23 // bottom
        ]);

        // 顶点下标,WebGL中只能绘制三角形
        // 因此绘制一个面(矩形),需要两个三角形
        // 
        // 0┌──────────┐1
        //  |          |
        //  │          │
        // 2└──────────┘3
        // 
        // 其中 [0, 1, 2] 三个顶点构成第一个三角形
        // 而 [1, 3, 2] 三个顶点构成了第二个三角形
        var indices = new Uint16Array([
             0,  1,  2,  1,  3,  2, // front
             4,  5,  6,  5,  7,  6, // back
             8,  9, 10,  9, 11, 10, // left
            12, 13, 14, 13, 15, 14, // right
            16, 17, 18, 17, 19, 18, // top
            20, 21, 22, 21, 23, 22  // bottom
        ]);

        return { vertices: vertices, normals: normals, indices: indices, size: indices.length };
    }

</div>

从getCubeVertexData方法中,我们获得了与立方体相关的顶点数据,其中包括了顶点坐标vertices,顶点法线方向normals,还有顶点下标indices。其中大家可以注意到,顶点的坐标是包含了z轴坐标,也就是包含了深度信息。有了这些信息,我们就可以进行下一步了,但在继续讲解前,我需要给大家普及一些基本的计算机图形学姿势——矩阵变换。

PG 以下内容涉及三角函数和线性代数,敬请家长注意

1、旋转变换

从上图,已知坐标(x, y),求出绕(0, 0)点旋转弧度b后的坐标(x, y)

我们可以使用矩阵来表示:

2、拉伸变换

已知坐标(x, y),求出绕(0, 0)点向x拉伸s倍,向y方向拉伸t倍后的坐标(x, y)

同样,我们可以使用矩阵来表示:

3、平移变换

已知坐标(x, y),求出向x方向平移s,向y方向平移t后的坐标(x, y)

似乎我们没有办法把它转换成矩阵表示?Too Naive,只要我们引入齐次坐标即可:

通过以上的演示,我们得到了这样一个结论,所有的几何变换都可以转换成这种向量左乘矩阵的形式表示,而且多种变换作用于同一坐标点,只需依次与对应的矩阵左乘即可。

有了以上这些数学姿势,我们就可以继续我们的编码了。

我们先看getCameraMatrix方法,用于获取视图变换矩阵。WebGL绘图都是眼睛(摄像机)在z轴上,向z轴负方向(即屏幕方向)看去产生的视图:

我们并不能改变这个视线的方向。因此,为了能从别的角度来观察场景,我们只能对场景本身进行操作,例如我们要把眼睛从(0, 0, 0)点移动到(0, 0, 10)点,实质上可以通过,把整个场景向z轴负方向移动10来到达相同的效果。也就是说,我们可以通过对场景进行反向的几何变换来模拟眼睛的移动。但如果每一步都需要我们手动的进行反向操作,也未免太麻烦了,为此gl-matrix中提供了mat4.lookAt这样一个方法来辅助我们进行计算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code" style="text-align: left;">

    function getCameraMatrix() {
        var viewMatrix = mat4.create();

        // 眼睛的位置
        var eye = vec3.fromValues(10, 10, 10);
        // 眼睛所看目标位置
        var center = vec3.fromValues(0, 0, 0);
        // 眼睛向上的方向
        var up = vec3.fromValues(-1, 1, -1);

        mat4.lookAt(viewMatrix, eye, center, up);

        return viewMatrix;
    }

</div>

利用mat4.lookAt方法,我们可以快速的得到眼睛从(10, 10, 10)点,望向(0, 0, 0)点的所需要的反向几何变换矩阵,我们把所得到的矩阵称为视图变换矩阵。

接下来我们看看getPerspectiveMatrix方法,用于获取透视变换矩阵。WebGL绘图的空间,实际为一个1x1x1的单位立方体,而我们眼睛所看到的真实的视觉空间,则是一个四方台:

我们要在WebGL中模拟这种透视,实际就是把这个四方台变换到WebGL的单位立方体上,只要是变换,我们都可以使用矩阵来表示,当然这其中的数学推导我(wo)就(ye)不(bu)说(dong)了,gl-mtraix给我们提供了mat4.perspective方法,来帮助我们计算出这个透视变换矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code" style="text-align: left;">

    function getPerspectiveMatrix() {
        var projectMatrix = mat4.create();

        // 视场角45度,宽高比为1,最近的平面为z等于0.1,最远的平面为z等于1000
        mat4.perspective(projectMatrix, 45, 1, 0.1, 1000);

        return projectMatrix;
    }

</div>

最后,调用getPositionalLight,来得到灯光信息。这里我们模拟的是一个点光源,与点光源相关的信息,只有两个,第一个是光源的颜色,另一个是光源的位置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code" style="text-align: left;">

    function getDirectionalLight() {
        // 点光源的颜色,白色,带点灰
        var color = vec3.fromValues(0.7, 0.7, 0.7);
        // 点光源的位置,坐标(-10, 5, 10)
        var position = vec3.fromValues(-10, 5, 10);

        return { color: color, position: position };
    }

</div>

三、3D世界

来到这里我们终于集齐7颗龙珠,可以召唤出神龙了!!!!!

好吧,其实还不可以,我们只是拥有了用于绘制的数据,但怎么绘制我们还不知道(神龙:怪我咯)

我们之前说过,要教会WebGL绘图,我们需要着色器。着色器其实是GPU提供给我们的可编程接口,用于对GPU的管线进行编程,使得GPU能完成我们所需的渲染需求。着色器程序写得好,你就等于成为了上帝,上帝说要有水,给你(http://www.html5tricks.com/demo/webgl-water/index.html),上帝说要有风,拿去(http://www.bongiovi.tw/experiments/webgl/blossom/

我们不需要弄这么复杂,只要有钱,不,只要一个立方体就可以了:

顶点着色器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code">

    attribute vec4 a_VertexPosition;
    attribute vec4 a_VertexNormal;
    uniform mat4 u_ProjectMatrix;
    uniform mat4 u_ViewMatrix;
    uniform mat4 u_NormalMatrix;
    varying vec3 v_VertexPosition;
    varying vec3 v_VertexNormal;

    void main() {
        vec4 vertexPosition =  u_ViewMatrix * a_VertexPosition;
        vec4 vertexNormal = u_NormalMatrix * a_VertexNormal;

        v_VertexPosition = vertexPosition.xyz;
        v_VertexNormal = vertexNormal.xyz;

        gl_Position = u_ProjectMatrix * vertexPosition;
    }

</div>

片元着色器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code">

    precision mediump float;
    varying vec3 v_VertexPosition;
    varying vec3 v_VertexNormal;
    uniform vec3 u_Color;
    uniform vec3 u_LightColor;
    uniform vec3 u_LightPosition;

    void main() {
        vec3 direction = normalize(u_LightPosition - v_VertexPosition);
        vec3 normal = normalize(v_VertexNormal);

        vec3 color = u_LightColor * u_Color * max(dot(direction, normal), 0.0);

        gl_FragColor = vec4(color, 1.0);
    }

</div>

鉴于篇幅的关系,这次我就先不解析这两个着色器的意思,有兴趣的同学可以rtx我。

有了着色器,我们就利用gl-core提供给我们的方法,生成着色器程序,把数据写于缓冲区,最终绘制我们想要的立方体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="km_insert_code">

    // 创建着色器程序
    var program = new Program(gl);

    // 绑定顶点着色器
    program.attach(VERTEX_SHADER_SOURCE, gl.VERTEX_SHADER);
    // 绑定片元着色器
    program.attach(FRAGMENT_SHADER_SOURCE, gl.FRAGMENT_SHADER);
    program.link();
    program.bind();

    // 创建顶点坐标缓存区
    var vertexBuffer = new Buffer(gl, gl.ARRAY_BUFFER);
    // 写入顶点坐标数据
    vertexBuffer.write(modelObject.vertices, gl.STATIC_DRAW);
    vertexBuffer.bind(program.attribs.a_VertexPosition, 3, gl.FLOAT);

    // 创建顶点法线缓冲区
    var normalBuffer = new Buffer(gl, gl.ARRAY_BUFFER);
    // 写入顶点法线数据
    normalBuffer.write(modelObject.normals, gl.STATIC_DRAW);
    normalBuffer.bind(program.attribs.a_VertexNormal, 3, gl.FLOAT);

    // 创建顶点下标缓存区
    var indexBuffer = new Buffer(gl, gl.ELEMENT_ARRAY_BUFFER);
    // 写入顶点下标数据
    indexBuffer.write(modelObject.indices, gl.STATIC_DRAW);
    indexBuffer.bind();

    // 写入透视变换矩阵
    gl.uniformMatrix4fv(program.uniforms.u_ProjectMatrix, false, projectMatrix);
    // 写入视图变换矩阵
    gl.uniformMatrix4fv(program.uniforms.u_ViewMatrix, false, viewMatrix);
    // 写入法线变换矩阵
    gl.uniformMatrix4fv(program.uniforms.u_NormalMatrix, false, normalMatrix);
    // 写入立方体颜色
    gl.uniform3f(program.uniforms.u_Color, 1.0, 0.0, 0.0);
    // 写入灯光颜色
    gl.uniform3fv(program.uniforms.u_LightColor, pointLight.color);
    // 写入灯光位置
    gl.uniform3fv(program.uniforms.u_LightPosition, pointLight.position);

    // 清除color buffer和depth buffer中的数据
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    // 绘制
    gl.drawElements(gl.TRIANGLES, modelObject.size, gl.UNSIGNED_SHORT, 0);

</div>

大功告成!!!!

以上!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
写得很详细
写得很详细
回复回复点赞举报
mark
mark
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
WebGL基础教程:第一部分
WebGL是一种基于OpenGL的浏览器内置3D渲染器,它可以让你在HTML5页面中直接显示3维内容。 在本教程中,我会介绍你使用此框架所需的所有基础内容。
前端达人
2019/01/12
2.8K0
WebGL基础教程:第一部分
WebGL简易教程(六):第一个三维示例(使用模型视图投影变换)
在上一篇教程《WebGL简易教程(五):图形变换(模型、视图、投影变换)》中,详细讲解了OpenGL\WebGL关于绘制场景的模型变换、视图变换以及投影变换的过程。不过那篇教程是纯理论知识,这里就具体结合一个实际的例子,进一步理解WebGL中是如何通过图形变换让一个真正的三维场景显示出来。
charlee44
2019/10/08
7370
WebGL简易教程(六):第一个三维示例(使用模型视图投影变换)
WebGL简易教程(十四):阴影
所谓阴影,就是物体在光照下向背光处投下影子的现象,使用阴影技术能提升图形渲染的真实感。实现阴影的思路很简单:
charlee44
2019/12/10
1.8K0
WebGL简易教程(十四):阴影
从关键概念开始,万字带你轻松入门 WebGL
只要理解了 WebGL 背后的概念,学习 WebGL 并没有那么难。很多 WebGL 入门文章并没有介绍这些重要的概念,直接使用 WebGL 复杂的 API 开始渲染图形,很轻松就把入坑文变成了劝退文。这篇文章将会着重讲解这些概念,并一步步探究 WebGL 是如何渲染图片到屏幕的,理解这些重要的概念,将会大大降低学习曲线。
羽月
2022/10/08
2.2K0
从关键概念开始,万字带你轻松入门 WebGL
【愚公系列】2023年08月 WEBGL专题-canvas和webgl的区别 | 技术创作特训营第一期
本文是专题类文章,主要是针对数字孪生和WEB 3D可视化展开,下面是数字孪生相关概念。
愚公搬代码
2023/08/27
7890
WebGL: 从 2D 开始
腾讯IVWEB团队
2017/10/13
5.1K0
WebGL: 从 2D 开始
webgl 基础
WebGL仅仅是一个光栅化引擎,它可以根据你的代码绘制出点,线和三角形。 WebGL在电脑的GPU中运行,每对方法中一个叫顶点着色器, 另一个叫片断着色器,并且使用一种和C或C++类似的强类型的语言 GLSL。 每一对组合起来称作一个 program(着色程序)
ronixiao
2022/08/08
1.5K0
WebGL基础教程:第三部分
欢迎回到第三部分,也是我们的迷你WebGL教程系列的最后一部分。在此课程中,我们会会介绍光照和添加2D对象到场景中。新的内容很多,我们还是直接开始吧。
前端达人
2019/01/12
2.7K0
WebGL基础教程:第三部分
【前端er入门Shader系列】02—GLSL语言基础
Shader 一般由顶点着色器和片段着色器成对使用,GLSL 则是编写 Shader 着色器的语言,而 GLSL ES 是在 OpenGL Shader 着色器语言的基础上针对移动端和嵌入式设备的简化版。本章介绍 GLSL 语言相关语法。
CS逍遥剑仙
2025/01/08
7700
WebGL简易教程(十):光照
在上一篇教程《WebGL简易教程(九):综合实例:地形的绘制》中,实现了对一个地形场景的渲染。在这篇教程中,就给这个地形场景加上光照,让其更加真实,立体感更强。
charlee44
2019/10/15
1.3K2
WebGL简易教程(十):光照
实用 WebGL 图像处理入门
技术社区里有种很有意思的现象,那就是不少人们口耳相传中的强大技术,往往因为上手难度高而显得曲高和寡。从这个角度看来,WebGL 和函数式编程有些类似,都属于优势已被论证了多年,却一直较为不温不火的技术。但是,一旦这些技术的易用性跨越了某个临界点,它们其实并没有那么遥不可及。这次我们就将以 WebGL 为例,尝试降低它的入门门槛,讲解它在前端图像处理领域的应用入门。
ConardLi
2020/02/23
3.3K0
音视频开发之旅(42)-光照基础(一)
环境光(Ambient Lightiing)不来自任何特定方向的光,在经典光照模型中会用一个常量来表示 使用时只需要对其片源着色器添加一个环境光常量,作为gl_Fragcolor的调制即可_
音视频开发之旅
2021/04/19
5980
音视频开发之旅(42)-光照基础(一)
【愚公系列】2022年09月 微信小程序-WebGL画正方形
WebGL(全写Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个JavaScript绑定,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地展示3D场景和模型了,还能创建复杂的导航和数据视觉化。显然,WebGL技术标准免去了开发网页专用渲染插件的麻烦,可被用于创建具有复杂3D结构的网站页面,甚至可以用来设计3D网页游戏等等。–百度百科
愚公搬代码
2022/10/05
9370
【愚公系列】2022年09月 微信小程序-WebGL画正方形
几个简单的小例子手把手带你入门webgl
各位同学们大家好,又到了周末写文章的时间,之前群里有粉丝提问, 就是shader不是很理解。然后今天他就来了, 废话不多说,读完今天的这篇文章你可以学到以下几点:
coder_koala
2021/09/18
1.5K0
几个简单的小例子手把手带你入门webgl
【愚公系列】2023年08月 WEBGL专题-3D特效-雾化
在3D图形渲染中,雾化是一种用于创建深度感的技术。它模拟了真实世界中的雾气效果,使远距离的物体看起来模糊不清,并且与背景融合在一起,从而增强了场景的真实感。
愚公搬代码
2025/05/28
810
【愚公系列】2023年08月 WEBGL专题-3D特效-雾化
WebGL简易教程(十三):帧缓存对象(离屏渲染)
事物是普遍联系的。为了达到更加真实的渲染效果,很多时候需要利用被渲染物体在其他状态下的中间渲染结果,处理到最终显示的渲染场景中。这种中间渲染结果,就保存在帧缓冲区对象(framebuffer object,简称FBO)中,用来替代颜色缓冲区或深度缓存区。由于其结果并不直接被显示出来,所以这种技术也被称为离屏绘制(offscreen drawing)。
charlee44
2019/12/02
2.9K0
Android多媒体之GL-ES战记第一集--勇者集结
前言 1.本系列借花献佛,结合了很多前人的文章以及书籍,我尽可能去总结并用我的思想进行加工 2.OpenGL一直是我的心结,也是时候去解开了,本系列称不上原创,但每行代码都有着我思考的痕迹 3.本系列所有的图片都是[张风捷特烈]所画,如果有什么错误还请指出,定会最快改正 4.本系列文章允许转载、截取、公众号发布,请保留前言部分,希望广大读者悉心指教 ---- NPC:开场词 传说,在这片代码大陆上,存在一个古老的种族,它们拥有无尽的力量,却罕有人能够驾驭 多媒体王国中存在一个隐蔽的角落
张风捷特烈
2019/02/25
1.7K0
Android多媒体之GL-ES战记第一集--勇者集结
【愚公系列】2023年08月 WEBGL专题-物体的选中
点击事件是用户在计算机屏幕或移动设备上单击(或轻敲)鼠标或触摸屏幕时发生的事件。当用户单击一个可交互元素时,例如按钮、链接或图像,浏览器会触发一个点击事件,通知网页代码用户已单击了该元素。
愚公搬代码
2025/05/28
340
【愚公系列】2023年08月 WEBGL专题-物体的选中
three.js 粒子效果(分别基于 CPU & GPU 实现)
前段时间做了一个基于 CPU 和 GPU 对比的粒子效果丢在学习 WebGL 的 RTX 群里,技术上没有多作讲解,有同学反馈看不太懂 GPU 版本,干脆开一篇文章,重点讲解基于 GPU 开发的版本。
万技师
2017/07/17
10.4K3
three.js 粒子效果(分别基于 CPU & GPU 实现)
WebGL 概念和基础入门
本文首发于政采云前端团队博客:WebGL 概念和基础入门 https://www.zoo.team/article/webglabout
政采云前端团队
2021/08/12
4.8K0
相关推荐
WebGL基础教程:第一部分
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验