首页 > 其他分享 >【WebGL系列-04】清除缓冲区并绘制图形

【WebGL系列-04】清除缓冲区并绘制图形

时间:2023-07-24 13:45:17浏览次数:38  
标签:04 缓冲 WebGL WebGLRenderingContext void 缓冲区 绘制 线段

清除缓冲区并绘制图形

前文中已经准备好了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类型字节数的整数倍

标签:04,缓冲,WebGL,WebGLRenderingContext,void,缓冲区,绘制,线段
From: https://www.cnblogs.com/masakulayou/p/17577000.html

相关文章

  • 打造原生 WebGL 2D 引擎:一场创意与技术的融合
    打造原生WebGL2D引擎:一场创意与技术的融合1.引言在当今数字化时代,网页的功能越来越丰富,已经远远超越了传统的文本和图片呈现。我们生活在一个充满交互性和视觉魅力的网络世界。每天都会遇到许多令人惊叹的网页效果和动画。作为一个Web3D图形的开发,希望可以通过网页来实现更多......
  • Linux系列---【Ubuntu 20.04安装KVM】
    Ubuntu20.04安装KVM一、安装kvm1.安装kvmsudoaptinstallqemu-kvmlibvirt-daemon-systemlibvirt-clientsbridge-utils2.将当前用户添加至libvirt、kvm组sudoadduser$USERlibvirtsudoadduser$USERkvm3.验证安装virshlist--all4.启动libvertsudosyst......
  • solidworks api ch04
    用默认模板新建零件,并修改用户偏爱:letnewPart(swApp:ISldWorks)=//GetthefilepathofthedefaultparttemplateletpartTemplate=swApp.GetUserPreferenceStringValue(intswUserPreferenceStringValue_e.swDefaultTemplatePart)letswModel=......
  • 用c语言实现2048小游戏
    ​ #include<time.h> #include<stdlib.h> #include<conio.h> #include<stdio.h> #include<windows.h> #definex026 #definey01 HANDLEhOutput=GetStdHandle(STD_OUTPUT_HANDLE); /*显示声明*/ voidp(int*a,inti,intx,inty); /*部......
  • 【大联盟】20230703 T2 开心的序列(sequence) 题解 AT_agc049_f 【[AGC049F] Happy Sequ
    zak/bx恐怖zak将这题加强,出到模拟赛。直接把\(A_i,B_i\le10^5,C_i\le5\)变成了\(A_i,B_i,C_i\le10^9\)。非常恐怖。题目描述点击膜拜zhoukangyang。题解重新再理解一遍。我们维护\(p(x)=\sum_i|a_i-x|+|b_i-x|\),那么就相当于要求\(\forallx,p(x)\le0\),也就......
  • cesium创建多段线缓冲区
    两种方式:一、前端直接引入turf库,使用turf.buffer方法创建。二、后端数据库引入postgis,使用ST_Buffer方法创建,前端调用对应接口的方式获取。下面分别给出两种方式的关键步骤,代码没有做整理,这里只是提供一下思路:turf库创建activeShapePoints数组里存的是鼠标拾取的多段线节点......
  • Ubuntu 20.04使用 VNC远程桌面连接避坑指南
    自从开始使用Ubuntu20.04搭建深度学习服务器,就想到使用VNC远程桌面连接使用。可是之前一直使用的是Ubuntu18.04,心里想着设置应该不难,结果在配置的时候总出现无法连接的错误。下面我就分享一下我使用TigerVNC配置远程桌面连接过程中遇到的问题和解决方法。本文使用的软件版本和使......
  • Ubuntu 20.04使用 VNC远程桌面连接避坑指南
    自从开始使用Ubuntu20.04搭建深度学习服务器,就想到使用VNC远程桌面连接使用。可是之前一直使用的是Ubuntu18.04,心里想着设置应该不难,结果在配置的时候总出现无法连接的错误。下面我就分享一下我使用TigerVNC配置远程桌面连接过程中遇到的问题和解决方法。本文使用的软件版本和使......
  • Ubuntu 20.04使用 VNC远程桌面连接避坑指南
    自从开始使用Ubuntu20.04搭建深度学习服务器,就想到使用VNC远程桌面连接使用。可是之前一直使用的是Ubuntu18.04,心里想着设置应该不难,结果在配置的时候总出现无法连接的错误。下面我就分享一下我使用TigerVNC配置远程桌面连接过程中遇到的问题和解决方法。本文使用的软件版本和使......
  • SP12304 题解
    原题链接|题解链接本篇题解为此题最较简单做法及最较少码量,并且码风优良,请放心阅读。题目简述当\(i\)的所有正因数和\(=\)\(n\)时,其中\(i\)的最小值。思路首先需要完成求一个数的所有正因数之和的函数\(f(n)\)。要求此函数可返回传入参数的所有正因数之和,那么......