编程学习网 > 编程语言 > Python > Python OpenGL绘制三大要素教程
2023
09-19

Python OpenGL绘制三大要素教程

尽管我们一直呼吁小伙伴们不要将OpenGL狭义地理解为绘制或者渲染API,但是在 OpenGL 3.2 Compute Shader未面世之前,它本质上确实是一套图形图像渲染的API。从功能上说,它的主要作用就是完成图形图像渲染,不管是UI界面的绘制,还是各大游戏引擎渲染,背后都是通过它来实现的。更重要的是,绘制或渲染的三大要素------画笔、画布、绘制方式它都一一具备,并且组成成分能够完全对应他们。

本篇将围绕绘制三大要素给小伙伴们讲述OpenGL中的绘制基本概念。我们首先会对画笔进行讲述,这小节是对顶点着色器的回顾,同时也会告诉大家另一种轻量的画笔;然后,我们将简单讲述画布,让大家对渲染窗口和视图窗口有更深层次的理解;接下来,我们会对绘制方式进行详细讲解,本小节也会让大家了解OpenGL中的基本形状。
画笔
不管是小伙伴们玩的酷炫游戏,还是在视频应用上看到的精美电视剧,它们都有着优美的画面。这些优美画面的展示和画笔息息相关。显示屏上每一个像素点的最终上色都由它完成,同时画笔的智能与否也决定了颜色是否精彩纷呈。
在OpenGL中,画笔主要由片段着色器所承担。在光栅化之后,画布被切割成了单个像素,每个像素都会交由一个片段器着色。所以大家也知道了,片段着色器这个画笔的精度非常之高,它的粒度细到每一个像素点。此外,它也是一个非常智能的画笔工具,它能够接受用户输入结合自定义函数计算出每一个像素点的最终颜色并上色。
然而,相比于片段着色器,另外一种画笔就很容易被小伙伴们忽略了,那就是一些颜色清除API。它对我们也至关重要,某些特定场景的高性能绘制离不开它。
现实中我们常常会有添加背景的需求,比如我们需要对某个UI控件添加白色或黑色的背景。这自然是可以通过着色器来实现的,但是小伙伴肯定也意识到了,杀鸡焉用牛刀,这么一个简单的绘制不应该由着色器这个复杂的画笔出场。这时候,OpenGL API中提供的一些颜色清除API就派上用场了,能够让大家快速、方便、高性能完成背景颜色的绘制。
glClearColor(0.0,0.0,0,1.0);  
glClear(GL_COLOR_BUFFER_BIT)
仅仅通过上面两行代码,我们就能完成背景颜色的绘制。这两行代码最终会将画布背景变成黑色。第一行代码是设置清除颜色,glClearColor函数的四个参数分别对应颜色的R、G、B、A四个分量。大家在实际开发中应该谨记,第一行代码仅仅是一个颜色设置函数,它无法单独实现背景颜色的更新,真正实现更新的是第二行代码。glClear这个函数只有一个参数,通过这个参数指定需要清除的缓冲区,一般来说,我们需要清除颜色缓冲区来更新背景颜色,因此会设置成例子中的GL_COLOR_BUFFER_BIT参数。两行代码结合使用之后,画布的背景就被更新成了黑色。
画布
好比画画,仅有画笔是不够的。真正开始画画之前,我们需要做一些准备操作的,除了提供画笔,也要提供一张画纸当作画布,这样才有地方给我们绘制。在OpenGL中,渲染窗口就是这样一张画布。当我们创建了渲染窗口,我们就有了画布,我们的绘制操作才会有空间承载,进而显示给用户。
然而,我们必须要说明的是渲染窗口无法完美对应OpenGL中画布这一概念。比如在Android中,我们通过本地窗口Surface创建渲染窗口,但是如果没有通过glViewPort函数设置视图窗口,那么颜色清除接口就不会在渲染窗口中生效。由此看来,OpenGL中和画布最贴切的应该是视图窗口。
理解了这一点,那小伙伴们应该对渲染窗口和视图窗口有了更为深层次的理解。渲染窗口就好比一张纸,这张纸我们可以全部用作画布,也可以把部分区域折叠起来用剩下的部分当作画布。glViewPort函数就是这个折叠工具。通过它提供的偏移以及宽高参数设置,我们就能获得真正的画布。
绘制方式及基本形状
现在我们已经有了画笔和画布,万事俱备,要开始进行正式的画画了。摆在我们面前首当其冲的是要解决“如何画”这个难题。
“如何画”这个任务其实从本质上来说就是要将这些顶点转化为具体的形状。我们前文中说,通过顶点数组就能确定绘制区域,其实这是一个不严谨的表述。客观世界中的基本形状多种多样,包括点、线、三角形、矩形、多边形等等,所以绘制区域其实是没有办法由这些顶点数组单独确定的,它可能是这些顶点数组对应的点,也可能是由这些顶点数组连接而成的线,当然更常见的是由顶点数组勾勒而成的三角形、矩形、多边形区域。光有顶点数组不指定目标形状,顶点数组勾勒出的区域就不具备确定性。一个由三个点组成的顶点数组,你既可以用来绘制三角形的三个顶点,也可以用于绘制三角形的三条边,当然也可以用于绘制三角形。
此外,这些形状是由哪些点组成、并以什么顺序连接,这些信息都是绘制必要信息。这些形状的具体转化方式仅仅通过顶点数组也是无法获得的,我们不知道有顶点数组中有哪些顶点实际参与了这些形状的转化,也不知道他们会以什么顺序参与转化,而后者关乎到的是取样区域,如果弄错,绘制出来的画面必然错位。
针对这些问题,OpenGL中有着明确的规范。针对目标形状,在OpenGL规范中只有点、线、三角形这三个基本形状(准确地说是OpenGLES,桌面端OpenGL的基础形状还包括多边形),其他形状都是由这些基本形状拼接而成,比如一个矩形就是由两个三角形拼接而成。至于“由哪些点组成、并以什么顺序连接”这个问题,glDraw**这些绘制函数本身就予以了回答。通过绘制函数的offset、first、count这些参数应用程序能够指定参与绘制区域的顶点,而通过mode参数指明的绘制方式,我们不仅能确定这些顶点勾勒出来的目标区域是什么形状,同时也能指定这些顶点的连接顺序。
由mode参数确定的绘制方式在OpenGL(准确地说是OpenGLES)中有以下几种模式:
public static final int GL_POINTS                    =0x0000;
public static final int GL_LINES                     =0x0001;
public static final int GL_LINE_LOOP                 =0x0002;
public static final int GL_LINE_STRIP                =0x0003;
public static final int GL_TRIANGLES                 =0x0004;
public static final int GL_TRIANGLE_STRIP            =0x0005;
public static final int GL_TRIANGLE_FAN              =0x0006;
下面,我们会对这些模式一一进行讲解,我们将以顶点数组[V0,V1,V2,V3,V4,V5]来进行演示
点绘制

通过将mode设置为GL_POINTS,我们就能绘制顶点数组中的每个顶点。点绘制如下图所示:               

线绘制
在OpenGL中,线表示一条线段。一条线段可以通过两个顶点来表达,多段线可以使用多个线段链接来表示,首尾闭合的多段线叫循环线。OpenGL中的线绘制有三种模式,分别是GL_LINES、GL_LINE_STRIP、GL_LINE_LOOP,它们分别代表了不连接线段、多条线段连接、多条线段连接再首尾相连这三种线段绘制方式,如下所示:
GL_LINES

GL_LINE_STRIP

GL_LINE_LOOP
       
三角形绘制
OpenGL中也提供了三种绘制三角形的方式,分别是GL_TRIANGLES、GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN。
GL_TRIANGLES
三种模式中最为常见的是GL_TRIANGLES。它标志着将用顶点数组每三个顶点为一个绘制单元绘制一个三角形。以顶点数组[V0,V1,V2,V3,V4,V5]为例,这种模式下将绘制两个三角形。第一个三角形的顶点排列顺序是[v0,v1,v2],第二个三角形的顶点排列顺序为[v3,v4,v5]。
     
GL_TRIANGLE_STRIP
GL_TRIANGLE_STRIP和GL_TRIANGLES较为类似,所不同的是顶点数组中的顶点会被重复使用。它构建三角形的规则如下:
除了首个三角形,后续三角形都会复用前面三角形的两个顶点;
当前顶点结合复用的两个顶点构成三角形的顺序依赖当前这个顶点的奇偶性(顶点索引从0开始)。如果当前顶点是奇数,那么组成三角形的顶点排列顺序为[n-1,n-2,n],其中n为当前顶点,n-1和n-2是前面三角形已经用过的顶点;反之,如果当前顶点是偶数,组成三角形的顶点排列顺序是[n-2, n-1,n]。
     
以上图为例,第一个三角形定点排列顺序是[v0,v1,v2],第二个三角形复用第一个三角形的后面两个顶点,同时,由于当前顶点索引是3,3是奇数,则顶点排列顺序是[v2,v1,v3],到了第三个三角形,由于顶点v4序号是4,4是偶数,因此顶点排列顺序是变为[v2,v3,v4],最后一个三角形顶点是奇数,排练顺序是[v4, v3, v5]。
GL_TRIANGLE_FAN
GL_TRIANGLE_FAN较为少见,一般用于画多边形或者圆。定点数组的首个顶点将固定下来,之后每次取两个顶点与之构建三角形,如下图所示:

小伙伴在OpenGL开发中要了解这些模式,并且按照这些模式指定的绘制顺序进行绘制。

以上就是Python OpenGL绘制三大要素教程的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取