,这是一篇硬核文章。需要专心阅读,觉得有用请点赞收藏!今天,我们将讨论WebGL。WebGL图形系统也是最难学的。为什么说难学呢?我认为这有两个主要原因。1、WebGL技术本身就是用来解决最复杂的视觉呈现的。比如大量绘制复杂的图形和3D模型,这样的难题适合用WebGL来解决。2、与其他图形系统相比,WebGL是一个更接近底层的系统。因为,不管是HTML/CSS、SVG还是Canvas,主要是利用它的API来绘制图形,所以我们不必关心它们具体的底层机制。3、我们只需要了解创建SVG元素的绘图声明,学会执行Canvas对应的绘图指令,能够输出图形,就足够了。4、要用WebGL画图,还得从细节入手。我们必须处理内存、GPU,并真正控制图形输出的每个细节。5、要学好WebGL,首先要了解一些基本概念和原理。今天先从图形系统的绘制原理说起,主要是WebGL最基本的概念,包括GPU、渲染管线、着色器。然后,我将引导您使用WebGL绘制一个简单的几何形状。希望这个可视化例子可以帮助大家理解WebGL绘制图形的基本原理,为绘图打下坚实的基础。图形系统是如何绘制的?让我们谈谈计算机图形系统的主要组件及其在绘图过程中的作用。知道了这一点,我们就很容易理解计算机图形系统绘图的基本原理。一个通用的计算机图形系统主要包括6个部分,即输入设备、中央处理器、图形处理单元、存储器、帧缓冲器和输出设备。光栅:几乎所有现代图形系统都基于光栅绘制图形,光栅指的是构成图像的像素阵列。像素:一个像素对应图像上的一个点,通常保存图像上特定位置的颜色等信息。FrameBuffer:在绘制过程中,像素信息存储在framebuffer中,是一个内存地址。CPU(CentralProcessingUnit):中央处理器,负责逻辑运算。GPU(GraphicsProcessingUnit):图形处理单元,负责图形计算。了解了这些概念,下面就带大家看一个典型的绘图流程,帮助大家理清这些概念的实际运用。首先,数据经过CPU处理,成为具有特定结构的几何信息。然后将此信息发送到GPU进行处理。光栅信息在GPU中分两步生成。这些光栅信息会输出到帧缓冲区,最后渲染到屏幕上。这个绘图过程是现代计算机中任何图形系统处理图形的常用过程。它主要做两件事。1、一种是结合绘图的场景元素(如摄像机、光源、遮挡物体等)对给定的数据进行计算,最后将图形转换为屏幕空间的二维坐标。2、二是对屏幕空间的每个像素进行着色,将最终的图形输出到显示设备。这整个过程是一步步进行的,上一步的输出是下一步的输入,所以我们也称这个过程为RenderPipelines。在这个过程中,CPU和GPU是参与计算过程的两个核心处理单元。下图来了,请准备小凳子。WebGL完整的绘制过程确实很复杂。为了帮助大家理解,请先理解绘图过程再写代码!1、创建WebGL上下文创建WebGL上下文的步骤和Canvas2D的使用几乎一样。constcanvas=document.querySelector('canvas');constgl=canvas.getContext('webgl');2.创建WebGL程序这里的WebGL程序是一个WebGLProgram对象,也就是为GPU运行着色器的程序,而不是我们正在写的三角形JavaScript程序。要创建这个WebGL程序,我们需要编写两个着色器(Shader)。着色器是用编程语言GLSL编写的代码片段。这里我们不需要太纠结于GLSL语言,我们会在后续的课程中进行详细的讲解。在这里,我们只需要了解这两个绘制三角形的着色器的作用即可。constvertex=`属性vec2位置;voidmain(){gl_PointSize=1.0;gl_Position=vec4(位置,1.0,1.0);}`;constfragment=`precisionmediopfloat;voidmain(){gl_FragColor=vec4(1.0,0.0,0.0,1.0);}`;那么我们为什么要创建两个着色器呢?这就需要我们首先了解顶点和图元这两个基本概念。在绘图时,WebGL使用顶点和图元来描述图形的几何信息。顶点是几何图形的顶点,例如三角形有三个顶点,四边形有四个顶点。图元是WebGL可以直接处理的图形单元,由WebGL的绘制模式决定,例如点、线、三角形等。因此在WebGL中绘制图形的过程一般需要用到两种着色器,一种叫做VertexShader顶点着色器(VertexShader)负责处理图的顶点信息,另一个叫做片元着色器(FragmentShader)负责处理图的像素信息。更具体地说,我们可以将顶点着色器理解为处理顶点的GPU程序代码。它可以改变顶点信息(如顶点坐标、法线方向、材质等),从而改变我们绘制图形的形状或大小等。顶点处理完成后,WebGL会计算出需要处理的像素点根据顶点指定的图元和绘制模式进行着色,然后对其执行片段着色器程序。简单来说,就是给指定图元中的像素点着色。WebGL从顶点着色器和图元中提取像素执行片段着色器代码的过程,就是我们前面提到的生成光栅信息的过程,我们也称之为光栅化过程。所以片元着色器的作用就是处理光栅化后的像素信息。创建shader的目的是创建WebGL程序,那么我们应该如何使用vertexshader和fragmentshader代码来创建WebGL程序呢?首先,因为在JavaScript中,顶点着色器和片段着色器只是一段代码,所以我们需要将它们分别创建为着色器对象。代码如下:片段着色器,片段);gl.compileShader(fragmentShader);接下来,我们创建一个WebGLProgram对象并将两个着色器与这个WebGL程序相关联。WebGLProgram对象的创建过程主要是添加vertexShader和fragmentShader,然后将这个WebGLProgram对象链接到WebGL上下文对象。代码如下:constprogram=gl.createProgram();gl.attachShader(program,vertexShader);gl.attachShader(program,fragmentShader);gl.linkProgram(program);最后,我们需要通过useProgram来选择启用这个WebGLProgram对象。这样,当我们绘制图形时,GPU就会执行我们通过WebGLProgram设置的两个shader程序。gl.useProgram(程序);好的,现在我们已经创建并配置了WebGL程序。接下来,我们只需要将三角形数据存储在缓冲区中,然后我们就可以将这些数据发送给GPU。在实现这一步之前,我们先来了解一下WebGL的坐标系。请听下一章分解如何预测后续...
