【WebGL系列-04】清除缓冲区并绘制图形
清除缓冲区并绘制图形
前文中已经准备好了webgl程序和绘制所用的数据,但是在绘制图像之前,还要对画布进行处理。
清除缓冲区
由于图像的绘制是一帧一帧绘制,每一帧针对当前的状态,计算屏幕上每个像素的颜色,得到最终的绘制结果。这些状态被保存在一个叫帧缓冲区的地方。帧缓冲区不仅能存储颜色数据,还会存储一些其他的数据。webgl的帧缓冲区至少由以下三个部分构成:
- 模板缓冲
- 深度缓冲
- 颜色缓冲
颜色缓冲顾名思义,存储的是当前帧每个像元的颜色,深度缓冲保存的是当前帧每个像元的深度信息。
所谓的深度,可以理解为相机离这个点的距离。由于图像最终是绘制在同一个平面上的,因此我们是无法判断两个物体哪个近哪个远的,使用了深度缓冲就可以解决这个问题。
模板缓冲则类似一个筛子,可以把需要绘制的地方绘制出来,而不需要的地方就不进行绘制。
在进行新的一帧的绘制的时候,我们需要把帧缓冲区中上一帧的数据进行清除,然后把当前帧的信息再次写入,才能得到正确的绘制结果。
接口
清除三个缓冲区对应以下接口:
void WebGLRenderingContext.clearColor(r, g, b, a)
设置颜色缓冲区的值(0-1),默认都为0
void WebGLRenderingContext.clearDepth(depth)
设置深度缓冲区的值(0-1),默认为1
void WebGLRenderingContext.clearStencil(s)
设置模板缓冲区的值(0或1),默认0
void WebGLRenderingContext.clear(mask)
清除指定的缓冲区(将指定的缓冲区设置为设定的值)
mask:GLbitfield,指定被清除的缓冲区,可以为以下值WebGLRenderingContext.COLOR_BUFFER_BIT,颜色缓冲区WebGLRenderingContext.DEPTH_BUFFER_BIT,深度缓冲区WebGLRenderingContext.STENCIL_BUFFER_BIT,模板缓冲区
当一次执行多个缓冲区的清除时,可以使用或(|)符号来连接
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
如果要得到设置的缓冲区的值,可以使用WebGLRenderingContext.getParameter接口
any WebGLRenderingContext.getParameter(pname)
获取参数
pname:要获取的参数名WebGLRenderingContext.COLOR_CLEAR_VALUE:颜色缓冲区值WebGLRenderingContext.DEPTH_CLEAR_VALUE:深度缓冲区值WebGLRenderingContext.STENCIL_CLEAR_VALUE:模板缓冲区值
绘制图形
最后,开始绘制图形,webgl中有两种绘制图形的方式,接口如下:
void WebGLRenderingContext.drawArrays(mode, first, count)
从向量数组中绘制图元
mode:GLenum,指定绘制图元的方式,可以是以下值:WebGLRenderingContext.POINTS,绘制一系列点WebGLRenderingContext.LINE_STRIP,绘制一个线条,即,绘制一系列线段,上一点连接下一点WebGLRenderingContext.LINE_LOOP,绘制一个线圈,即,绘制一系列线段,上一点连接下一点,并且最后一个与第一个点相连WebGLRenderingContext.LINES,绘制一系列单独的线段,每两个点作为端点,线段之间不连接WebGLRenderingContext.TRIANGLE_STRIP,绘制一个三角带WebGLRenderingContext.TRIANGLE_FAN,绘制一个三角扇WebGLRenderingContext.TRIANGLES,绘制一系列三角形,每三个点作为顶点
first:指定从哪个点开始绘制count:指定绘制需要使用到多个点
void WebGLRenderingContext.drawElements(mode, count, type, offset)
从数组数据渲染图元
mode:GLenum,指定绘制图元的方式,可以是以下值WebGLRenderingContext.POINTS,绘制一系列点WebGLRenderingContext.LINE_STRIP,绘制一个线条,即,绘制一系列线段,上一点连接下一点WebGLRenderingContext.LINE_LOOP,绘制一个线圈,即,绘制一系列线段,上一点连接下一点,并且最后一个与第一个点相连WebGLRenderingContext.LINES,绘制一系列单独的线段,每两个点作为端点,线段之间不连接WebGLRenderingContext.TRIANGLE_STRIP,绘制一个三角带WebGLRenderingContext.TRIANGLE_FAN,绘制一个三角扇WebGLRenderingContext.TRIANGLES,绘制一系列三角形,每三个点作为顶点
count:GLint,指定要渲染的元素数量type:GLenum,指定元素数组缓冲区中的值的类型,可能的值WebGLRenderingContext.UNSIGNED_BYTEWebGLRenderingContext.UNSIGNED_SHORT- 当使用
OES_element_index_uint扩展时WebGLRenderingContext.UNSIGNED_INT
offset:GLintptr,指定元素数组缓冲的字节偏移量,必须是type类型字节数的整数倍
【WebGL系列-04】清除缓冲区并绘制图形的更多相关文章
- webgl 系列 —— 绘制猫
其他章节请看: webgl 系列 绘制猫 上文我们了解了如何绘制渐变彩色三角形,明白了图形装配.光栅化,以及片元着色器计算片元的颜色. 现在如果让你绘制如下一只猫.难道绘制很多三角形,然后指定它们的颜 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- CSS 魔法系列:纯 CSS 绘制图形(心形、六边形等)
<CSS 魔法系列>继续给大家带来 CSS 在网页中以及图形绘制中的使用.这篇文章给大家带来的是纯 CSS 绘制五角星.六角形.五边形.六边形.心形等等. 我们的网页因为 CSS 而呈现千 ...
- 【Silverlight】Bing Maps学习系列(五):绘制多边形(Polygon)图形(转)
[Silverlight]Bing Maps学习系列(五):绘制多边形(Polygon)图形 Bing Maps Silverlight Control支持用户自定义绘制多边形(Polygon)图形, ...
- webgl 系列 —— 绘制一个点(版本2、版本3、版本4、版本5)
绘制一个点 我们初步认识了 webgl,本篇主要围绕绘制一个点的示例,逐步实现下面功能: 点的位置从 js 传入着色器 点的大小由 js 传入着色器 通过鼠标点击绘点 通过鼠标点击绘点,并改变点的颜色 ...
- webgl 系列 —— 初识 WebGL
初识 WebGL 什么是 WebGL webgl 在支持 canvas 的浏览器中进行 2d 或 3d 渲染. webgl 程序除了有 Html.javascript,还需要加入着色器语言(GLSL ...
- webgl 系列 —— 渐变三角形
其他章节请看: webgl 系列 渐变三角形 本文通过一个渐变三角形的示例逐步分析:varying变量.合并缓冲区.图形装配.光栅化.varying 内插 绘制三个点v1 需求:绘制三个相同颜色的点, ...
- webgl 系列 —— 着色器语言
其他章节请看: webgl 系列 着色器语言 本篇开始学习着色器语言 -- GLSL全称是 Graphics Library Shader Language (图形库着色器语言) GLSL 是一门独立 ...
- WebGL编程指南案例解析之绘制一个点
<!DOCTYPE html> <html> <head> <title>webgl</title> <style type=&quo ...
- webgl 系列 —— 变换矩阵和动画
其他章节请看: webgl 系列 变换矩阵和动画 动画就是不停地将某个东西变换(transform).例如将三角形不停地旋转就是一个动画 和 CSS transform 类似,变换有三种形式:平移.缩 ...
随机推荐
- KMP字符串匹配问题
KMP算法 本文参考资料:https://www.zhihu.com/question/21923021 KMP算法是一种字符串匹配算法,可以在 \(O(n+m)\) 的时间复杂度内实现两个字符串的匹 ...
- pytes中fixture的scope: 决定可以在什么范围内共享fixture
1fixture的scope 在@pytest.fixture(scope='xxx')中,scope的可选值有5个,以下是官网的描述 2 function级别的scope 添加如下代码到pytest ...
- 关于ObservableCollection的更新与不更新分析
因为最近在WPF项目中,遇到ObservableCollection这个属性的频繁使用,一个一个坑跳过来,今天看到这个贴子 玩转INotifyPropertyChanged和ObservableCol ...
- 2021-01-06:mysql中,我存十亿个手机号码,考虑存储空间和查询效率,用什么类型的字段去存?
福哥答案2021-01-06: [答案来自此链接:](https://www.zhihu.com/question/438078173)首先提出假设:考虑一下这几个问题:手机号码都是数字吗?都是中国的 ...
- 2022-03-04:爱吃香蕉的珂珂。 珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 珂珂可以决定她吃香蕉的速度 K (单位:根
2022-03-04:爱吃香蕉的珂珂. 珂珂喜欢吃香蕉.这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉.警卫已经离开了,将在 H 小时后回来. 珂珂可以决定她吃香蕉的速度 K (单位:根 ...
- 2021-05-03:给定一个非负整数num, 如何不用循环语句, 返回>=num,并且离num最近的,2的某次方 。
2021-05-03:给定一个非负整数num, 如何不用循环语句, 返回>=num,并且离num最近的,2的某次方 . 福大大 答案2021-05-03: 32位整数,N=32. 1.非负整数用 ...
- 2021-11-23:规定:L[1]对应a,L[2]对应b,L[3]对应c,...,L[25]对应y。 S1 = a, S(i) = S(i-1) + L[i] + reverse(invert(S(
2021-11-23:规定:L[1]对应a,L[2]对应b,L[3]对应c,-,L[25]对应y. S1 = a, S(i) = S(i-1) + L[i] + reverse(invert(S(i- ...
- 7-8 切分表达式——写个tokenizer吧 (20 分)
1.题目描述: [先说点出题背景] 这个题是为低年级同学.学C语言的同学准备的,因为,对这部分同学,这个题目编写起来略有一点复杂.如果是高年级.学过了正则表达式(Regular Expression) ...
- linux 系统安全和应用
目录 一.系统安全 二.账号安全 三.修改密码生效时间 四.强制下次登录成功时修改密码 五.历史命令 六.终端自动注销 七.wheel组 八.grub菜单密码 一.系统安全 原因:1.系统数据想要保护 ...
- ODOO学习网址推荐
Odoo官文文档: https://www.odoo.com/zh_cn/page/docs http://www.odoo.com/documentation/8.0/ Odoo中文文档推荐: ht ...