清除缓冲区并绘制图形

前文中已经准备好了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_BYTE
    • WebGLRenderingContext.UNSIGNED_SHORT
    • 当使用OES_element_index_uint扩展时
      • WebGLRenderingContext.UNSIGNED_INT
  • offset:GLintptr,指定元素数组缓冲的字节偏移量,必须是type类型字节数的整数倍

【WebGL系列-04】清除缓冲区并绘制图形的更多相关文章

  1. webgl 系列 —— 绘制猫

    其他章节请看: webgl 系列 绘制猫 上文我们了解了如何绘制渐变彩色三角形,明白了图形装配.光栅化,以及片元着色器计算片元的颜色. 现在如果让你绘制如下一只猫.难道绘制很多三角形,然后指定它们的颜 ...

  2. 【Windows编程】系列第五篇:GDI图形绘制

    上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...

  3. CSS 魔法系列:纯 CSS 绘制图形(心形、六边形等)

    <CSS 魔法系列>继续给大家带来 CSS 在网页中以及图形绘制中的使用.这篇文章给大家带来的是纯 CSS 绘制五角星.六角形.五边形.六边形.心形等等. 我们的网页因为 CSS 而呈现千 ...

  4. 【Silverlight】Bing Maps学习系列(五):绘制多边形(Polygon)图形(转)

    [Silverlight]Bing Maps学习系列(五):绘制多边形(Polygon)图形 Bing Maps Silverlight Control支持用户自定义绘制多边形(Polygon)图形, ...

  5. webgl 系列 —— 绘制一个点(版本2、版本3、版本4、版本5)

    绘制一个点 我们初步认识了 webgl,本篇主要围绕绘制一个点的示例,逐步实现下面功能: 点的位置从 js 传入着色器 点的大小由 js 传入着色器 通过鼠标点击绘点 通过鼠标点击绘点,并改变点的颜色 ...

  6. webgl 系列 —— 初识 WebGL

    初识 WebGL 什么是 WebGL webgl 在支持 canvas 的浏览器中进行 2d 或 3d 渲染. webgl 程序除了有 Html.javascript,还需要加入着色器语言(GLSL ...

  7. webgl 系列 —— 渐变三角形

    其他章节请看: webgl 系列 渐变三角形 本文通过一个渐变三角形的示例逐步分析:varying变量.合并缓冲区.图形装配.光栅化.varying 内插 绘制三个点v1 需求:绘制三个相同颜色的点, ...

  8. webgl 系列 —— 着色器语言

    其他章节请看: webgl 系列 着色器语言 本篇开始学习着色器语言 -- GLSL全称是 Graphics Library Shader Language (图形库着色器语言) GLSL 是一门独立 ...

  9. WebGL编程指南案例解析之绘制一个点

    <!DOCTYPE html> <html> <head> <title>webgl</title> <style type=&quo ...

  10. webgl 系列 —— 变换矩阵和动画

    其他章节请看: webgl 系列 变换矩阵和动画 动画就是不停地将某个东西变换(transform).例如将三角形不停地旋转就是一个动画 和 CSS transform 类似,变换有三种形式:平移.缩 ...

随机推荐

  1. Split to Be Slim: 论文复现

    摘要:在本论文中揭示了这样一种现象:一层内的许多特征图共享相似但不相同的模式. 本文分享自华为云社区<Split to Be Slim: 论文复现>,作者: 李长安 . Split to ...

  2. react中受控组件与非受控组件--

    非受控组件:随用随取 1 render() { 2 return ( 3 <div> 4 <h1>非受控组件</h1> 5 <form action=&quo ...

  3. [C++核心编程] 2、引用

    文章目录 2 引用 2.1 引用的基本使用 2.2 引用注意事项 2.3 引用做函数参数 2.4 引用做函数返回值 2.5 引用的本质 2.6 常量引用 2 引用 2.1 引用的基本使用 **作用: ...

  4. SSH客户端常用工具SecureCRT操作

    目录 1.1 SecureCRT工具介绍 1.2 SecureCRT工具安装 1.3配置SecureCRT连接Linux主机 1.4调整SecureCRT终端显示和回滚缓冲区大小 1.5调整字体及光标 ...

  5. 2022-10-05:在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。 当开始下雨时,在时间为 t 时,水池中的水位为 t 。

    2022-10-05:在一个 n x n 的整数矩阵 grid 中, 每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度. 当开始下雨时,在时间为 t 时,水池中的水位为 t . ...

  6. 2021-01-02:java中,MinorGC、MajorGC、FullGC 什么时候发生?

    福哥答案2021-01-02: MinorGC 在年轻代空间不足的时候发生.MajorGC 指的是老年代的 GC,出现 MajorGC 一般经常伴有 MinorGC.FullGC 老年代无法再分配内存 ...

  7. 2021-05-27:定义何为step sum?比如680,680+68+6=754,680的step sum叫754。

    2021-05-27:定义何为step sum?比如680,680+68+6=754,680的step sum叫754.给定一个整数num,判断它是不是某个数的step sum? 福大大 答案2021 ...

  8. 2022-01-27:供暖器。 冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。 在加热器的加热半径范围内的每个房屋都可以获得供暖。 现在,给出位于一条水平线上的房屋 hous

    2022-01-27:供暖器. 冬季已经来临. 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖. 在加热器的加热半径范围内的每个房屋都可以获得供暖. 现在,给出位于一条水平线上的房屋 hous ...

  9. 2021-09-08:每一个项目都有三个数,[a,b,c]表示这个项目a和b乐队参演,花费为c。每一个乐队可能在多个项目里都出现了,但是只能被挑一次。nums是可以挑选的项目数量,所以一定会有nums

    2021-09-08:每一个项目都有三个数,[a,b,c]表示这个项目a和b乐队参演,花费为c.每一个乐队可能在多个项目里都出现了,但是只能被挑一次.nums是可以挑选的项目数量,所以一定会有nums ...

  10. javaer你还在手写分表分库?来看看这个框架怎么做的 干货满满

    java orm框架easy-query分库分表之分表 高并发三驾马车:分库分表.MQ.缓存.今天给大家带来的就是分库分表的干货解决方案,哪怕你不用我的框架也可以从中听到不一样的结局方案和实现. 一款 ...