【笔记】《WebGL编程指南》学习-第3章绘制和变换三角形(2-你好三角形))
来源:互联网 发布:淘宝网网页版 编辑:程序博客网 时间:2024/05/17 01:55
目标:
- 绘制一个简单的二维图形:三角形
- 利用三角形画一个矩形
结果:
HelloTriangle.js
//顶点着色器程序var VSHADER_SOURCE = 'attribute vec4 a_Position;'+ 'void main(){'+ 'gl_Position=a_Position;'+ '}';//片元着色器程序var FSHADER_SOURCE= 'void main(){'+ 'gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);'+ '}';function main() { //获取canvas元素 var canvas = document.getElementById("webgl"); if(!canvas){ console.log("Failed to retrieve the <canvas> element"); return; } //获取WebGL绘图上下文 var gl = getWebGLContext(canvas); if(!gl){ console.log("Failed to get the rendering context for WebGL"); return; } //初始化着色器 if(!initShaders(gl,VSHADER_SOURCE,FSHADER_SOURCE)){ console.log("Failed to initialize shaders."); return; } //设置顶点位置 var n = initVertexBuffers(gl); if (n < 0) { console.log('Failed to set the positions of the vertices'); return; } //指定清空<canvas>颜色 gl.clearColor(0.0, 0.0, 0.0, 1.0); //清空<canvas> gl.clear(gl.COLOR_BUFFER_BIT); //绘制三个点 gl.drawArrays(gl.TRIANGLES, 0, n);}function initVertexBuffers(gl) { var vertices = new Float32Array([ 0.0, 0.5, -0.5, -0.5, 0.5, -0.5 ]); var n=3; //点的个数 //创建缓冲区对象 var vertexBuffer = gl.createBuffer(); if(!vertexBuffer){ console.log("Failed to create thie buffer object"); return -1; } //将缓冲区对象保存到目标上 gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); //向缓存对象写入数据 gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW); var a_Position = gl.getAttribLocation(gl.program, 'a_Position'); if(a_Position < 0){ console.log("Failed to get the storage location of a_Position"); return -1; } //将缓冲区对象分配给a_Postion变量 gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0); //连接a_Postion变量与分配给它的缓冲区对象 gl.enableVertexAttribArray(a_Position); return n;}
与上一节的 MultiPoint.js 相比,两处关键的改动在于:
- 在顶点着色器中,指定点的尺寸的一行 gl_pointSize = 10.0; 被删去了。该语句只有在绘制单个点的时候才起作用。
- gl.drawArray()方法的第1个参数从 gl.POINTS 被改为了 gl.TRIANGLES。
gl.drawArray()的第1个参数 mode 十分强大。在这个参数上指定不同的值,我们可以按照不同的规则绘制图形。下面详细了解一下。
基本图形
将gl.drawArrays()方法的第1个参数 mode 改为 gl.TRAINGLES,就相当于告诉WebGL,“从缓冲区的第1个顶点开始,使顶点着色器执行3次,用这3个点绘制出一个三角形”:
这样,缓冲区的3个点就不再是相互独立的,而是同一个三角形中的3个顶点。
WebGL 方法 gl.drawArray()即强大又灵活,通过给第1个参数指定不同的值,我们就能以7种不同的方式来绘制图形。下表对此进行了详细介绍,其中 v0,v1,v2等等表示缓冲区中的顶点,顶点的顺序将影响绘制的结果。
如图所示,WebGL 只能绘制三种图形:点、线段和三角形。但是,从球体到立方体,再到游戏中的三维角色,都可以由小的三角形组成。实际上,你可以用以上这些最基本的图形来绘制出任何东西。
运行下结果:
Hello Rectangle
让我们使用这个最基本的方法来试着绘制一个矩形。
下图显示了矩形的顶点。当然,顶点的个数为4,因为这是一个矩形。如上一节所述,WebGL不能直接绘制矩形,你需要将其划分为两个三角形(v0,v1,v2)和(v2,v1,v3),然后通过 gl.TRIANGLE、gl.TRIANGLE_STRIP或者gl.TRIANGLE_FAN 将其绘制出来。本例使用 gl.TRIANGLE_STRIP 进行绘制,只需要用到4个顶点。如果用 gl.TRIANGLES,就要用到6个。
运行一下:
- 【笔记】《WebGL编程指南》学习-第3章绘制和变换三角形(2-你好三角形))
- 【笔记】《WebGL编程指南》学习-第3章绘制和变换三角形(1-绘制多个点)
- 【笔记】《WebGL编程指南》学习-第3章绘制和变换三角形(4-动画))
- 【笔记】《WebGL编程指南》学习-第3章绘制和变换三角形(3-移动旋转缩放))
- 《WebGL编程指南》学习——绘制和变换三角形
- 【笔记】《WebGL编程指南》学习-第5章颜色与纹理(2-彩色三角形)
- 【笔记】《WebGL编程指南》学习-第2章WebGL入门(6-改变点的颜色))
- 【笔记】《WebGL编程指南》学习-第6章着色器语言(2-矢量和矩阵)
- 【笔记】《WebGL编程指南》学习-第2章WebGL入门(2-WebGL的HelloWorld)
- 【笔记】《WebGL编程指南》学习-第2章WebGL入门(3-画一个点-版本1))
- 【笔记】《WebGL编程指南》学习-第1章WebGL概述
- 【笔记】《WebGL编程指南》学习-第4章高级变换与动画基础(1-平移然后旋转))
- WebGL三角形平移变换
- WebGL三角形旋转变换
- WebGL-三角形绘制
- WebGL绘制三角形
- 【笔记】《WebGL编程指南》学习-第7章进入三维世界(1-视点和视线)
- 【笔记】《WebGL编程指南》学习-第2章WebGL入门(4-画一个点-版本2))
- [NLP]CS224n学习笔记一:NLP介绍
- emWin 2天速成实例教程015_二维码控件的使用示例
- Unity3D中的快捷键
- [读书笔记]js函数参数的按值传递
- 2.1Java面向对象思想
- 【笔记】《WebGL编程指南》学习-第3章绘制和变换三角形(2-你好三角形))
- opencv1.0播放视频文件一闪而过
- android面试-加载图片如何防止OOM(YY面试涉及)
- emWin 2天速成实例教程016_不规则异形进度条控件实现方法
- 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(四)FreeRTOS系统下LwIP-1.4.1的移植
- 指针二三事
- JavaScript 中 apply 、call 的详解
- 玲珑杯 1164
- jQuery方法原生实现---each遍历