本专栏所有文章示例代码均可在我的gitee码云上获取,读者可自行下载:https://gitee.com/babyogl/learnWebGL;本文demo代码在chapter-03下的draw-word-01.html,读者可以自行下载查看;

如果读者还对本专栏的文章内容和编程方式还不是很了解,建议先对前面的文章进行学习:博客专栏:webgl基础学习。前面的几节课,笔者为大家演示了WebGL如何绘制三角形和矩形,也说过绘制这些图案当然不是无聊绘制着玩的,这节课我们就利用绘制多个三角形和矩形,然后来组成我们的一些简单的汉字。下面我们先来看一张图

这个“王”字(ps:会不会令你想起隔壁老王?哈哈) ,总共有四笔,我们可以用四个矩形来组成它,分别用16个顶点,以第一横为例,要画两个三角形,画图时顶点的顺序组合为:(v0,v1, v2),(v2,v1,v3),其实不只这种顺序组合,读者可以自行探索其他的组合。其他的笔画也按照这个顺序来,最终经过绘制后,就会有一个王字清晰地呈现在我们面前,像前面的文章一样,给其加一个交互菜单栏工具,用于控制其位置的平移、旋转缩放。不同的是,这一次的旋转,我们利用更加有逼格的形式实现。

着色器

来看一下着色器:

<script id="v-shader" type="x-shader/x-vertex">attribute vec2 a_position;uniform vec2 u_resolution;//分辨率uniform vec2 u_translate;//平移uniform vec2 u_rotate;//旋转uniform vec2 u_scale;//缩放varying vec4 v_color;void main(){vec2 sPosition = a_position * u_scale;vec2 rotatePosition = vec2(sPosition.x * u_rotate.y + sPosition.y * u_rotate.x,sPosition.y * u_rotate.y - sPosition.x * u_rotate.x);vec2 position = rotatePosition + u_translate;vec2 zeroToOne = position / u_resolution;vec2 zeroToTwo = zeroToOne * 2.0;vec2 clipSpace = zeroToTwo - 1.0;gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);//(1,-1)将坐标原点设置为左上角v_color = vec4(gl_Position.xyz * 0.5, 0.6);}
</script><script id="f-shader" type="x-shader/x-vertex">#ifdef GL_ESprecision mediump float;#endifvarying vec4 v_color;void main(){gl_FragColor = v_color.rbga;}
</script>

初始化数据

初始化相关的数据,包括平移、旋转、缩放、顶点位置、以及菜单栏相关命令初始化:

 let translate = [100, 150];let rotate = [0, 1];let scale = [1, 1];//王let wang = [//第一横0, 0,150, 0,0, 30,0, 30,150, 0,150, 30,//第二横0, 80,150, 80,0, 110,0, 110,150, 80,150, 110,//第三横0, 160,150, 160,0, 190,0, 190,150, 160,150, 190,//竖60, 30,60, 160,90, 30,90, 30,60, 160,90, 160];let guiField = {'平移X': translate[0],'平移Y': translate[1],'缩放X': scale[0],'缩放Y': scale[1]};

建立菜单栏和建立绘制函数

function initGui(gl, program) {let gui = new dat.GUI();gui.add(guiField, '平移X', 0, gl.canvas.width-200).onChange(function(e) {translate[0] = e;drawScene(gl, program);});gui.add(guiField, '平移Y', 0, gl.canvas.height-200).onChange(function(e) {translate[1] = e;drawScene(gl, program);});gui.add(guiField, '缩放X', -4, 4).onChange(function (e) {scale[0] = e;drawScene(gl, program)});gui.add(guiField, '缩放Y', -4, 4).onChange(function (e) {scale[1] = e;drawScene(gl, program)});let ui = document.getElementById('ui-translate');ui.appendChild(gui.domElement);}//获取着色器中的attribute变量的位置function getAttribute(gl, program, name) {return gl.getAttribLocation(program, name);}//获取着色器中的uniform变量的位置function getUniform(gl, program, name) {return gl.getUniformLocation(program, name)}function drawScene(gl, program) {webglUtils.resizeCanvasToDisplaySize(gl.canvas);//告诉WebGL如何从剪辑空间转换为像素gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);//清除canvasgl.clear(gl.COLOR_BUFFER_BIT);//应用着色器程序gl.useProgram(program);//开启顶点属性gl.enableVertexAttribArray(program.pLocation);//绑定缓冲区gl.bindBuffer(gl.ARRAY_BUFFER, program.positionBuffer);setGeometry(gl, wang);//获取缓冲区数据gl.vertexAttribPointer(program.pLocation, 2, gl.FLOAT, false, 0, 0);//设置分辨率gl.uniform2f(program.rLocation, gl.canvas.width, gl.canvas.height);//旋转gl.uniform2fv(program.roLocation, rotate);//设置平移gl.uniform2fv(program.tLocation, translate);//设置缩放gl.uniform2fv(program.sLocation, scale);gl.drawArrays(gl.TRIANGLES, 0, wang.length / 2);}

主函数

 function main() {let canvas = document.getElementById('translate');let gl = canvas.getContext('webgl', {antialias: true, depth: false})if (!gl) {alert("您的浏览器不支持WebGL!")}//获取顶点和片段着色器文本let vShaderSource = document.getElementById('v-shader').text;let fShaderSource = document.getElementById('f-shader').text;//创建着色器程序let program = initShader(gl, vShaderSource, fShaderSource);program.pLocation = getAttribute(gl, program, 'a_position');program.rLocation = getUniform(gl, program, 'u_resolution');program.tLocation = getUniform(gl, program, 'u_translate');program.roLocation = getUniform(gl, program, 'u_rotate');program.sLocation = getUniform(gl, program, 'u_scale');//创建缓冲区program.positionBuffer = gl.createBuffer();//绑定缓冲区gl.bindBuffer(gl.ARRAY_BUFFER, program.positionBuffer);drawScene(gl, program);initGui(gl, program);//利用jQuery绘制圆控制图形的旋转$("#ui-rotate").gmanUnitCircle({width: 200,height: 200,value: 0,slide: function(e,u) {rotate[0] = u.x;rotate[1] = u.y;drawScene(gl, program);}});}

当然,除了“王”字,笔者也将构成“华”的顶点数组post出来,笔者可以自行尝试:

let hua = [45, 60,75, 80,0, 140,35, 120,65, 120,35, 240,35, 240,65, 120,65, 240,125, 80,155, 80,125, 240,125, 240,155, 80,155, 240,200, 80,220, 100,155, 140,135, 210,205, 210,135, 240,135, 240,205, 210,205, 240,0, 250,210, 250,0, 280,0, 280,210, 250,210, 280,85, 180,115, 180,85, 400,85, 400,115, 180,115, 400];

程序实现效果

这种单个字的效果看起来可能不是很炫酷,下一节笔者将带领大家一起绘制多个字,并控制它们的平移,旋转,缩放。

原生webgl学习(六) WebGL写简单的汉字(一)相关推荐

  1. webgl学习六 纹理贴图

    <html><head><title>纹理贴图</title><script type="text/javascript" s ...

  2. (六) 自己写简单的u-boot

    前言:想想 uboot 的代码量,我们说自己写一个 bootloader 是不是口出狂言了?然而并没有,bootloader 的唯一目的只有一个,那便是启动内核.内核就是一大段可执行程序,我们只要跳转 ...

  3. 原生webgl学习(四) WebGL绘制矩形(一)

    本专栏所有文章示例代码均可在我的gitee码云上获取,读者可自行下载:https://gitee.com/babyogl/learnWebGL:本节代码在文件夹chapter-02里面的color-t ...

  4. WebGL学习之纹理盒

    原文地址:WebGL学习之纹理盒 我们之前已经学习过二维纹理 gl.TEXTURE_2D,而且还使用它实现了各种效果.但还有一种立方体纹理 gl.TEXTURE_CUBE_MAP,它包含了6个纹理代表 ...

  5. WebGL学习(1) - 三角形

    原文地址:WebGL学习(1) - 三角形 还记得第一次看到canvas的粒子特效的时候,真的把我给惊艳到了,原来在浏览器也能做出这么棒的效果.结合<HTML5 Canvas核心技术>和网 ...

  6. Unity开发webgl学习中文手册的笔记

    Unity开发webgl没做过,看手册怕忘下次难得的找所以放到这来了,可以自行去看手册 桌 面平台的大多数主要浏览器的当前版本都支持 Unity WebGL 内容,但不同浏览器提供的支持程度存在差异. ...

  7. 我的webgl学习之路(一)

    我的webgl学习之路 (一) 做项目中偶然需要移动端3d展示,所以学习了threejs;但是有着各种限制,还有就是项目要达到好的效果肯定是需要后期处理等等,所以展开了我学习webgl之路,我刚开始毫 ...

  8. 学习C++就这么简单 ——《写给大家看的C++书》

    学习 C++ 就这么简单 --<写给大家看的 C++ 书> 我们认为,程序员选用 C++ 语言来编写程序的理由不外乎两种,由此可以把 C++ 程序员大致划分为两类:第一类是那些一开始就学 ...

  9. webgl学习路线_WebGL:WebAssembly和功能路线图

    webgl学习路线 Yesterday, engineers from Google, Microsoft and Mozilla (makers of Chrome, Edge and Firefo ...

最新文章

  1. 一直想测试的NGINX变量输出,最于有办法了。
  2. java 快排和堆排序
  3. 数据结构 -- 队列
  4. 002_模板 + 数据模型 = 输出
  5. hdu5391 Zball in Tina Town
  6. 【Linux】一步一步学Linux——batch命令(134)
  7. Android-Universal-Image-Loader 的使用说明
  8. mysql 命令 select_Mysql基础命令(二)select查询操作
  9. 2016-Fiddler
  10. EXPDP Fails With ORA-04031 (streams pool, ...)
  11. 《Two Dozen Short Lessons in Haskell》学习(三)
  12. (一)Redfish简介
  13. 大学英语四级考试大纲
  14. 上学期间你收到最感动的小纸条是什么?
  15. python3制作中文词云_Python_制作中文词云
  16. 关于“企业文化”的联想
  17. iOS 动态字体设置
  18. 一键GHOST的使用方法
  19. 从财报、抗疫回望变革:BAT的“基因改造”这些年怎么样了?
  20. 15.大理石在哪儿(Uv10474)

热门文章

  1. vue3 注册全局方法 定义全局方法
  2. 计算机01无法纯随机,玄不救非,氪不改命 如何分清游戏中的“真随机”和“伪随机”?...
  3. Windows+iPad扩展屏幕-随航功能
  4. 《MLB美职棒大联盟》:世界大赛最有价值球员奖
  5. 【星辰傀儡线·命运环·卷二 尘埃】 2 魔猫
  6. linux根据修改日期删除,在Linux下怎么一次性删除掉那些修改时间为指定日期的所有文件?...
  7. Typora的崩溃导致文件丢失
  8. outlook打开总是要输入密码,怎么办?
  9. 我的世界java边境之地_我的世界边境之地怎么去?minecraft边境之地
  10. 基于Java的坦克大战游戏的设计与实现(论文+PPT+源码)