【得物技术】走进 Web3D 的世界 (1) 画个立方体吧
需要了解一下的前置知识(下面是推荐阅读的链接)
Shaderthebookofshaders.com/01/
矩阵bk.tw.lvfukeji.com/wiki/%E7%9F…
齐次坐标bk.tw.lvfukeji.com/wiki/%E9%BD…
最终效果
step1:建立 webgl 渲染上下文
这个就是简单的获取 dom 然后获取上下文 (注意下这里因为是画 3d 所以要开启深度检测)
step2:创建顶点着色器与片元着色器
关于着色器 shader 是一个超级大的话题(推荐看 TheBooksOfShader,尴尬的是作者没写完)。
大致可以这么理解:
• 顶点着色器确定了画布上点的位置
• 3d 世界中基础的几何图形是三角形,片元着色器代表了区域的表现形式
先看一下 webgl 的坐标系,z+轴是面向我们的视角:
下面这段是顶点着色器:
attribute :只能存在于 vertex shader 中,一般用于保存顶点或法线数据,它可以在数据缓冲区中读取数据。
vec3 vPosition 定义了一个 3 维向量
因为 3d 空间一个点(x,y,z)
mat4(1,0, 0, 0 ,0, 0.52, -0.85, 0, 0, 0.85, 0.52, 0, 0, 0, 0,1)是一个齐次矩阵 表示绕 y 轴旋转 45 度
mat4(0.52,0, 0.85, 0 ,0, 1, 0, 0, -0.85, 0, 0.52, 0, 0, 0, 0,1)表示绕 z 轴旋转 45 度
这样我们才能看到 3d 的效果。
下面这个就是编译 shader,固定套路记住就好了 (开发中不大会用原生手写 webgl)
下面这段是片元着色器:
表示的意思是画布上的颜色是红色 vec4(1.0,0,0,1.0)然后也是固定套路:
step3:创建一个程序
记住就好,就是调用 api
step4:链接程序与着色器
记住就好,就是调用 api
step5:建立缓冲数据
cube 是用来获取顶点坐标
剩下的都是套路,api 就不展开了,可以去 mdn 上查阅
step6 渲染
gl.drawArrays(gl.LINES, 0, 48)就是渲染的 api
webgl 中有 7 种图元 (表示怎么画)
gl.POINTS 孤立点 绘制一系列点
gl.LINES 绘制一系列单独线段。每两个点作为端点,线段之间不连接
gl.LINE_STRIP 连续线段 绘制一个线条。即,绘制一系列线段,上一点连接下一点
gl.LINE_LOOP 连续线圈 绘制一个线圈。即,绘制一系列线段,上一点连接下一点,并且最后一点与第一个点相连
gl.TRIANGLES 孤立三角形
gl.TRIANGLE_STRIP 三角带
gl.TRIANGLE_FAN 三角扇
0,48 表示从 0 取 48 个点绘制
总结
上述过程就是一个完整的 webgl 绘画流程。
完整的代码
文|alex
关注得物技术,携手走向技术的云端
版权声明: 本文为 InfoQ 作者【得物技术】的原创文章。
原文链接:【http://xie.infoq.cn/article/82c2ecd0be3fd312c3e9ed304】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论