基于Python语言的图形二维纹理映射实验设计

2023-06-07 19:13李津潘海梅
科技风 2023年15期
关键词:计算机图形学Python语言

李津 潘海梅

摘要:计算机图形学作为一门本科专业选修课程,实验课程以C语言为主。随着计算机编程语言的发展和普及,Python语言已成为重要的科研和开发工具。为提高学生对Python语言运用的能力,设计一个基于Python语言的计算机图形学实验:二维纹理映射原理探究实验。实验的目的是将纹理图案叠加到图形的表面,增强图形的细节信息。首先,将纹理图案从二维空间映射到三维景物空间。在此基础上,将纹理信息与物体表面在三维空间进行插值映射。最后,将映射后的图形映射回二维屏幕坐标系中。本文将介绍算法原理并设计对应的实验。基于Python语言的图形纹理映射实验可以帮助学生深刻理解并掌握计算机图形学中纹理映射的相关理论知识,强化学生运用Python语言解决实际问题的能力,从而增强学生的实践能力、创新能力以及探索能力。

关键词:计算机图形学;二维纹理映射;Catmull算法;Blinn算法;Python语言

计算机图形学是计算机科学与技术、自动化、软件工程等专业中重要的专业选修课程,是目前计算机学科中最活跃的分支之一[1]。计算机图形学不仅是计算机动画等应用的理论基础,并服务于计算机辅助设计与制造、虚拟现实、增强现实等一系列产业,并提供核心技术和算法支持[2]。计算机图形学课程涉及大量数学知识,同时需要扎实的编程基础,学习计算机图形学是对基础课程学习的综合运用。

随着计算机技术的普及,越来越多非计算机专业的学生也需要使用编程语言来进行科学技术、统计和绘图等。Python作为极易入门的编程语言,具有简单易学、免费开源、可移植性强等优点,非常适合学生在本科阶段学习并熟练运用。

为了帮助学生深入理解计算机图形学中图形纹理映射的相关知识,做到理论学习与实践相结合,提高学生对Python语言的实践能力,并进一步提高学生的学习兴趣和创新能力,本文设计基于Python语言的二维图形纹理映射实验。该实验适用于本科计算机图形学课程中图形纹理映射章节的实验教学。

1纹理映射相关知识元

在进行图形纹理映射实验之前,需要深入了解中断相关的知识元,本文实验涉及二維图形纹理映射,本节分别对这相关的知识元进行了简述。

1.1纹理映射

纹理映射也称纹理贴图,它试图通过一种合适的算法为待映射的模型表面上的每个三维顶点分配一个颜色值,从而达到将空间纹理图案叠加到图形的表面,增强图形的细节信息的效果。

1.2 纹理映射基本算法

纹理映射算法的核心是确定屏幕像素中可见表面覆盖的纹理区域,基于已知物体表面参数信息,在不规则或者曲面的物体表面,实现将空间中的纹理渲染到物体表面的过程。常见的纹理映射算法包括Catmull算法[3]和 Blinn算法[4]。

1.2.1 Catmull算法

Catmull算法一般采用双线插值的方法,该算法通过递归分割对曲面进行连续分割,直到每一个子曲面只包含一个像素中心。然后将子曲面中心的参数值映射到纹理空间中,使各像素可见的子曲面对应于纹理空间中的指定区域。最后取纹理空间中交点处的纹理图像值确定的像素平均纹理颜色作为该图像中心可见点的纹理属性[6]。原理如图1所示:

图1  Catmull算法的基本过程

在实际处理过程中,Catmull算法中还考虑了多个子曲面对应的平均纹理对像素的共同影响。进而解决细分生成的子曲面可能无法准确覆盖在屏幕上所有的像素区域和多个子曲面也可能包含在一个像素中的问题。在这里,我们假设像素e所对应的景物表面上的可见区域中包含有n个子曲面,则像素e的光亮度可通过计算和像素e相关的各个子曲面对其光亮度的贡献值得出,计算公式如下:

其中,为n个子曲面的平均光亮度,为各个子曲面在像素e中的投影面积(Se)与整个像素的面积(S1+S2+…Sn)之比。

虽然使用Catmull方法省去了纹理空间和物体之间的逆变换过程,但由于算法在计算各子曲面片在每一个像素内的可见区域及投影面积采用的是解析方法,因此会占用大量的存储空间,计算复杂,时间耗费大。

1.2.2 Blinn算法

Blinn算法可以将像素表示的区域投影在景物表面上,然后利用映射到纹理空间的曲面得到相应的纹理属性。

Blinn的原始凹凸贴图算法在纹理的每个纹理元素上存储了两个用来描述曲面上各点朝向的有符号的值bu和bv,这两个值对应的是沿u和v图像轴改变法线的量。

Blinn方法的提出有效克服了Catmull方法的缺点,因此,一般的纹理映射过程中,为达到更令人满意的结果,我们可以根据实际使用的需求将Blinn算法与Catmull算法结合使用。

1.3 兩步法纹理映射技术

纹理映射技术主要是针对由多边形组成的不规则物体表面纹理映射处理的技术,此次实验采用两步法纹理映射法实现二维纹理映射。

两步纹理映射技术的核心是借助一个中间映射媒介来完成从纹理空间到景物空间的表面纹理映射处理工作,其基本过程可用下面两个步骤来完成:

(1)将二维纹理空间映射到某个三维中间媒介表面:

(2)将这个三维中间媒介表面映射到目标景物表面:

在这里,将O映射和S映射的复合得到纹理空间到景物空间的纹理映射可表示为:

根据上述过程,考虑例如平面,柱面,立方体以及球面等常见的中介几何,可建立四种中介表面到景物表面的映射关系。

2基于Python的纹理映射综合实验设计

2.1实验目的

(1)通过基于python语言的二维纹理映射实验帮助学生掌握二维纹理映射原理,以及二维纹理映射实现过程,深入理解二维纹理映射相关知识元。

(2)通过实验加深对纹理映射技术和纹理映射算法的理解,掌握二维纹理映射的程序编写过程。

2.2实验环境准备

二维纹理映射实验基于python+OpenGL的环境。先安装anacode,pycharm等各类python编译平台,再配置pyOpenGL库。该实验环境具体搭建步骤可参考win10+Anaconda3+python3.6+openGL+pyCharm安装和配置。

2.3实验内容与实验步骤

2.3.1实验内容

(1) 指定图像纹理坐标,用索引指定顶点属性。

(2) 指定解析方式并启动顶点属性。

(3) 设置纹理对象,包括定义和绑定纹理对象,设置wrap和filter参数,并加载纹理。

(4) 着色器中使用纹理对象,在着色器中,对两个纹理的颜色进行混合。

2.3.2实验步骤

步骤1:指定纹理坐标,包括顶点坐标、顶点位置和顶点颜色的处理。

步骤2:指定解析方式并启动顶点属性。

(1)创建并绑定VBO和EBO。

(2)将顶点数据传送到GPU。

(3)指定解析方式和顶点属性。

步骤3:设置纹理对象。

(1)创建与绑定纹理对象。

(2)设置WRAP参数。

(3)设置Filter参数。

(4)加载纹理。

步骤4:着色器中使用纹理对象,通过着色器完成图像的渲染将两个纹理单元混合。

3二维纹理映射实验具体过程

3.1指定纹理坐标

使用索引指定顶点属性数据,属性数据包括顶点位置,顶点颜色和顶点纹理等。

3.2指定解析方式并启动顶点属性

在指定纹理坐标后,我们还需要指定纹理坐标的解析方式,将顶点属性绑定到顶点着色器中的属性变量中。

3.2.1 创建并绑定VBO和EBO

通过创建VBO和EBO两个缓冲对象,分别存储顶点数据和索引数据。

3.2.2 将顶点数据传送到GPU

在OpenGL程序中指定或者加载的数据是存储在CPU中的,为了加快图形渲染,我们将顶点属性数据传送到GPU。

3.2.3 指定解析方式和顶点属性

通过设置glVertexAttribPointer(index, size, type, normalized, stride, pointer)函数指定解析方式并启动顶点属性。

3.3配置纹理对象

3.3.1 创建与绑定纹理对象

由于此次实验图像是像素的2D数组,纹理通过调用glGenTextures()函数来生成纹理对象,同时调用glBindTexture()函数将其绑定到二维纹理中。

3.2.2 设置WRAP参数

在绘制操作期间,纹理中的像素将使用纹理坐标来检索颜色信息。当纹理坐标不在[0,0]到[1,1]范围时,可通过以下四种选项来控制:

GL_REPEAT: 形成重复的模式,忽略坐标整数部分。

GL_MIRRORED_REPEAT:纹理重复,当坐标的整数部分为奇数时会被镜像。

GL_CLAMP_TO_EDGE:坐标夹在0和1。

GL_CLAMP_TO_BORDER:超出范围的坐标被赋予指定的边框颜色。

3.2.3 设置Filter参数

當使用纹理坐标映射到纹素数组时,可能会由于纹理坐标与纹素不能完全匹配,使得纹理图像被拉伸超过原始大小而缩小的情况。此时可通过对纹理坐标进行取整,使用最佳逼近点来获取纹素值,即最近邻滤波(GL_NEAREST)。又或者通过每个纹素位置附近一组纹素的加权平均值来确定最终的纹素值,即线性滤波(GL_LINEAR)。

3.2.4 加载纹理

调用glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_FLOAT, pixels)函数定义纹理图像的格式,宽度和高度等信息。

3.4着色器中使用纹理对象

纹理对象首先通过顶点着色器传递纹理坐标,再使用uniform变量向片元着色器传递纹理单元的索引号获得最终的最终的纹素。对于着色器,采用的是GLSL语言编写的程序,每一个着色器程序对象可以包含多个着色器对象,使用着色器需要包含以下3个步骤:

步骤1:创建和编译着色器对象。

步骤2: 创建着色器程序对象,链接多个着色器对象到着色器程序中。

步骤3:在绘制场景时启动着色器程序。

结语

本文根据计算机图形学纹理映射实验的实践教学需求,设计了基于python语言的二维纹理映射实验,既可以帮助学生理解掌握纹理映射知识元,也可以将理论知识对应到纹理映射过程实验中进行深入理解。为了使学生深刻掌握计算机图形学中纹理映射基础理论与实践,本文涉及的两步法纹理映射技术是纹理映射方法的一种,其核心是通过一个中间媒介完成纹理映射工作,此外,过程性纹理映射技术也是纹理映射技术的常用方法之一。学生通过参与实验过程及实验结果分析,可以加深对二维纹理映射过程的理解,锻炼学生的实践能力以及创新能力。

参考文献:

[1]肖文芳,黄稚霆,欧俊宏,等.基于人工智能的计算机视觉研究领域发展现状研究——基于多种可视化工具的比较分析[J].科技创新与应用,2022,12(36):27-30.

[2]宋丹,杨?,李茂林,等.人工智能在学前教育中的应用浅探[J].今日科苑,2019(10):31-42.

[3]董荻.人工智能与教育的融合——智能机器人在学前教育领域的应用[J].教育教学论坛,2019(31):1-2.

[4]徐蒙蒙. 学前教育与儿童发展的因果效应[D].哈尔滨工业大学,2021.

[5]刘玉.儿童原创绘本创作在学前教育专业中的意义与应用[J].现代职业教育,2022(37):129-131.

基金项目:2022年陕西师范大学校级教改项目:OBE理念下大数据技术和课程思政相融合的教学改革与实践;2023年教育部产学合作协同育人项目:人工智能专业的大数据技术教学实验实训平台建设(220904615273340)

作者简介:李津(1991—  ),男,汉族,陕西西安人,博士,讲师,研究方向:包括多模态学习、数据压缩与检索、人工智能教育。

猜你喜欢
计算机图形学Python语言
Python语言程序设计教学体系建设
面向计算生态的Python语言入门课程教学方案
基于Python语言和支持向量机的字符验证码识别
论Python程序设计语言
基于Python语言的面向对象课程实践教学探讨
计算机图形学与图形图像处理技术
用面向科学思维的教学方法改进计算机图形学课程教学
三维投影变换的MATLAB实现
基于Android的Python语言英汉维电子词典设计与实现
基于计算思维的计算机图形学教学改革与实践