OpenGL
文章平均质量分 59
dalong10
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Python之OpenGL笔记(38):三种光照通道的合成
一、目的1、实现镜面光照射下的棋盘球体;2、环境光、散射光、镜面光三种光照通道的合成二、程序运行结果三、镜面光 现实世界中,当光滑表面被照射时会有方向很集中的反射光。这就是镜面光(Specular) 与散射光最终强度仅依赖于入射光与被照射点法向量的夹角不同,镜面光的最终强度还依赖于观察者的位置。也就是说,如果从摄像机到被照射点的向量不在反射光方向集中的范围内,观察者将不会看到镜面光,图6-12简单地说明了这个问题。 镜面光的计算模型比前面的两种光都要复杂一些,具体公式如下。原创 2020-08-03 09:47:41 · 1683 阅读 · 1 评论 -
Python之OpenGL笔记(37):散射光下的棋盘球体
一、目的1、实现散射光照射下的棋盘球体;二、程序运行结果三、散射光 上一小节中给出了仅仅使用环境光进行照射的案例,读者可能觉得效果并不好。确实如此,仅仅有环境光的场景效果是很差的,没有层次感。本节将介绍另外一种真实感好很多的光照效果—散射光(Diffuse),其指的是从物体表面向全方位360°均匀反射的光,如图6-8所示。 散射光具体代表的是现实世界中粗糙的物体表面被光照射时,反射光在各个方向基本均匀(也称为“漫反射”)的情况。 虽然反射后的散射光在各个方向是均匀的,但散射光反射原创 2020-08-02 09:39:36 · 811 阅读 · 0 评论 -
Python之OpenGL笔记(36):环境光下的棋盘球体
一、目的1、实现环境光照射下的棋盘球体;二、程序运行结果三、光照的基本模型 如果要用一个数学模型完全真实地描述现实世界中的光照是很难的,一方面数学模型本身可能太过复杂,另一方面复杂的模型可能导致巨大的计算量。因此,OpenGL中采用的光照模型相对现实世界进行了很大的简化,将光照分成了3种组成元素(也可以称为3个通道),包括:环境光、散射光镜面光 具体情况如图6-5所示。四、环境光 环境光(Ambient)指的是从四面八方照射到物体上,全方位360°都均匀的光。其代表的是原创 2020-08-01 08:38:47 · 873 阅读 · 0 评论 -
Python之OpenGL笔记(35):曲面物体的构建
一、目的1、曲面物体的构建画球体;2、棋盘纹理着色器应用;二、程序运行结果三、曲面物体的构建基本原理 吴亚峰《OpenGL ES 3.x游戏开发》(上卷)内容 OpenGL 中任何形状的 3D 物体都是用三角形拼凑而成的,因此,构建ᴢ面物体最重要的就是找到将曲面恰当拆分成三角形的策略。最基本的策略是首先按照一定的规则将物体按行和列两个方向进行拆分,这时就可以得到很多的小四边形。然后再将每个小四边形拆分成两个三角形即可。 球面首先被按照纬度(行)和经度(列)的方向拆分成了很多的小四原创 2020-07-31 14:35:51 · 916 阅读 · 0 评论 -
Python之OpenGL笔记(34):采用了顶点常量属性方法画多彩六角星
一、目的1、采用了顶点常量属性方法画多彩六角星;二、程序运行结果三、顶点常量属性 吴亚峰《OpenGL ES 3.x游戏开发》(上卷)内容 前面的很多案例中,给每一个顶点都单独指定了颜色值,这在很多情况下是很好的一种选择。但是,如果一个物体中所有的顶点颜色是一样的,这样做就显得效率不高了。因为这样不但更多地占用了内存空间,还会无谓增加数据 IO 的时间。本节将向读者介绍顶点常量属性技术,通过其可以很好地解决上述效率不够高的问题,具体内容如下:##1、顶点常量基本知识 顶点常量属性原创 2020-07-30 16:30:29 · 747 阅读 · 0 评论 -
Python之OpenGL笔记(33):透视投影画六角星
一、目的1、摄像机应用,透视投影画六角星;二、程序运行结果三、透视投影 吴亚峰《OpenGL ES 3.x游戏开发》(上卷)内容 现实世界中人眼观察物体时会有“近大远小”的效果,因此,要想开发出更加真实的场景,仅使用正交投影是远远不够的,这时可以采用透视投影。透视投影的投影线是不平行的,他们相交于视点。通过透视投影,可以产生现实世界中“近大远小”的效果,大部分 3D 游戏采用的都是透视投影。 透视投影中,视景体为锥台形区域,如图 5-7 所示。 从图 5-7 中可以看出,透视原创 2020-07-28 22:21:15 · 911 阅读 · 0 评论 -
Python之OpenGL笔记(32):正交投影画六角星
一、目的1、摄像机应用,正交投影画六角星;二、程序运行结果三、摄像机的设置 吴亚峰《OpenGL ES 3.x游戏开发》(上卷)内容 从日常生活的经验中可以很容易地了解到,随着摄像机位置、姿态的不同,就算是对同一个场景进行拍摄,得到的画面也是迥然不同的。 摄像机的设置需要给出 3 方面的信息,包括摄像机的位置、观察的方向以及 up 方向,具体情况如图5-1 所示。摄像机的位置很容易理解,用其在 3D 空间中的坐标来表示。摄像机观察的方向可以理解为摄像机镜头的指向,用一个观察原创 2020-07-27 16:31:22 · 728 阅读 · 0 评论 -
Python之OpenGL笔记(31):扭动的软糖
一、目的1、顶点着色器的妙用,画一个扭动的软糖;二、程序运行结果三、基本原理 吴亚峰《OpenGL ES 3.x游戏开发》(下卷)内容 从图 2-4 中可以看出,软糖模型实际上是由很多层小矩形叠加而成。在同一帧中,随着 y 坐标的不断升高,此层的顶点绕中心轴扭曲的角度越大。因此,实现扭动软糖的效果只要将代表软糖的长方体中各层顶点的 x、z 坐标按照一定的规则根据顶点的 y 坐标以及当前帧的控制参数进行变换即可,具体的计算思路如图 2-5、图 2-6 与图 2-7 所示。 具体的计算原创 2020-07-26 15:42:42 · 747 阅读 · 0 评论 -
Python之OpenGL笔记(30):飘扬的旗帜
一、目的1、二维纹理映射学习,画一个飘扬的旗帜;2、向奋战在防疫一线的白衣天使们致敬。二、程序运行结果三、基本原理 吴亚峰《OpenGL ES 3.x游戏开发》(下卷)内容 1、矩形的旗帜由大量的小三角形组成的。这样只要在绘制一帧画面时由顶点着色器根据一定的规则变换各个顶点的位置,即可得到旗帜迎风飘动的效果。 2、例子给出的是旗帜面向 z 轴正方向,即顶点沿 z 轴上下振动,形成的波浪沿 x轴传播的情况。同时将坐标系沿x轴的方向旋转一个角度,便于观察z轴的变化。 3、逐渐增加原创 2020-07-25 15:23:46 · 1852 阅读 · 0 评论 -
Python之OpenGL笔记(29):使用多个纹理单元混合的立方体
一、目的1、二维纹理映射学习,画一个使用多个纹理单元混合的立方体;二、程序运行结果三、使用多个纹理单元 一个纹理单元能支持多个纹理绑定到不同的目标,一个程序中也可以使用多个纹理单元加载多个2D纹理。 使用多个纹理单元的代码如下:// 使用0号纹理单元glActiveTexture(GL_TEXTURE0)glBindTexture(GL_TEXTURE_2D, texid1...原创 2020-02-26 12:29:40 · 1259 阅读 · 0 评论 -
Python之OpenGL笔记(28):二维纹理映射(2D textures)
一、目的1、二维纹理映射学习,画一个顶点颜色和纹理混合的立方体;二、程序运行结果三、纹理映射的概念和原理1、使用纹理增加物体表面细节 使用纹理,将物体表面的细节映射到建模好的物体表面,这样不仅能使渲染的模型表面细节更丰富,而且比较方便高效。纹理映射就是这样一种方法,在程序中通过为物体指定纹理坐标,通过纹理坐标获取纹理对象中的纹理,最终显示在屏幕区域上,已达到更加逼真的效果。2、纹素...原创 2020-02-25 15:20:11 · 2774 阅读 · 0 评论 -
Python之OpenGL笔记(27):镜像变换
一、目的1、画一组镜像变换的正方体;二、程序运行结果三、镜像变换 镜像变换,就是反射成像的概念,它是缩放变换的一个特例,当缩放因子k<0k < 0k<0时会导致镜像变换。执行镜像变换后的效果如程序运行结果图所示: 上面图中,第一象限为原图,第二象限为关于y轴的镜像,即点 (x,y,z)镜像后点(-x,y,z),因此所求矩阵为:KaTeX parse error:...原创 2020-02-24 13:04:38 · 1700 阅读 · 0 评论 -
Python之OpenGL笔记(26):不动点与旋转和缩放
一、目的1、画一组绕不动点旋转的正方体;二、程序运行结果三、为什么需要模型变换 OpenGL中的坐标处理过程包括模型变换、视变换、投影变换、视口变换等内容具体过程如下图2所示: 我们在OpenGL中通过定义一组顶点来定义一个模型,或者通过其他3D建模软件事先建好模型然后导入到OpenGL中。顶点属性定义了模型。如果我们要在一个场景中不同位置显示同一个模型怎么办? 如果我们要以不...原创 2020-02-16 15:19:21 · 1188 阅读 · 0 评论 -
Python之OpenGL笔记(25):动态管线绘制球体
一、目的1、画一个球体;二、程序运行结果三、球体的生成 1、将球体横向向切成30片, 纵向切30片,共900个点,见示意图 2、循环生成900个点的空间坐标(x,y,z),球面上点C的坐标 3、 x= R * cos(NumAngleHy) * cos(NumAngleZx) 4、 y = R * sin(NumAngleHy) 5、 z = R * cos(NumA...原创 2020-02-15 16:22:25 · 3023 阅读 · 1 评论 -
Python之OpenGL笔记(24):正方体多纹理贴图
一、目的1、画一个旋转的立方体,对正方体的六个面进行多纹理贴图;二、程序运行结果三、片元着色器 顶点着色器是做出3D图像的轮廓框架(毛坯,进行空间与空间变化等与空间相关操作) 片元 着色器让它变得好看一些,即上色(装修,进行颜色与纹理等操作)#四、正方体多纹理贴图 把图片映射到正方体的6个面上,有两种方法: 1. 加载一个纹理图片,这个纹理图片包含6个面的信息,如...原创 2020-02-14 09:24:25 · 3456 阅读 · 0 评论 -
Python之OpenGL笔记(23):复习VBO、VAO、VEO
一、目的1、复习VBO、VAO、VEO,画一个旋转的立方体;二、程序运行结果三、 关于坐标的问题1. 标准化设备坐标: 输入的顶点数据就应该在标准化设备坐标范围里面即:x,y,z的值都在(-1-1)之间。在这个区间之外的坐标都会被丢弃。 1.1一旦顶点数据传入顶点着色器中,那它们一定全都是标准化设备坐标了。 1.2标准化设备坐标符合右手定则,即原点在屏幕中心。2. 屏...原创 2020-02-13 22:13:51 · 1610 阅读 · 0 评论 -
Python之OpenGL笔记(22):箭头控制平面直角坐标系中的圆圈移动
一、目的1、箭头控制平面直角坐标系中的圆圈上下左右移动;二、程序运行结果三、glfw回调函数set_key_callbackglfw.set_key_callback(window, on_key) 设置键盘回调函数。def on_key(window, key, scancode, action, mods):打开键(窗体、键值、扫描码、动作、辅助键) 参数说明: wi...原创 2020-02-12 11:39:13 · 1057 阅读 · 2 评论 -
Python之OpenGL笔记(21):描点法画圆
一、目的1、描点法画圆;二、程序运行结果三、说明 描点法画圆函数drawCircle( x0,y0,R) 圆心坐标x0,y0 ;半径R 等分角A=2π/等分数;则圆上任一点坐标 x=x0+RcosA;y=y0+RsinA;z=0 将圆上的每个点坐标存入数组返回。四、glDrawArrays方法 在OpenGl中所有的图形都是通过分解成三角形的方式进行...原创 2020-02-11 20:04:27 · 2057 阅读 · 0 评论 -
Python之OpenGL笔记(20):画平面直角坐标系
一、 目的1、画平面直角坐标系;二、程序运行结果三、numpy.hstack()函数1、函数 函数原型:numpy.hstack(tup),其中tup是arrays序列,阵列必须具有相同的形状,除了对应于轴的维度(默认情况下,第一个)。 等价于np.concatenate(tup,axis=1)2、例1 >>> import numpy as np...原创 2020-02-10 17:45:43 · 2051 阅读 · 0 评论 -
Python之OpenGL笔记(15):摇动镜头下的立方体
一、目的1、使照相机围绕场景转动,看镜头里的立方体。二、程序运行结果三、坐标系统概述 在流水线里面我们在将对象转换到屏幕空间之前会先将其转换到多个坐标系统(Coordinate System)。1、局部坐标是对象相对于局部原点的坐标;也是对象开始的坐标。2、将局部坐标转换为世界坐标,世界坐标是作为一个更大空间范围的坐标系统。这些坐标是相对于世界的原点的。3、接下来我们将世界坐标转...原创 2019-06-28 09:01:54 · 1124 阅读 · 0 评论 -
Python之OpenGL笔记(5):OpenGL着色器语言(GLSL)应用画三角形
目的 1. 修改顶点着色器让三角形上下颠倒:2. 使用uniform定义一个水平偏移量,在顶点着色器中使用这个偏移量把三角形移动到屏幕右侧: 程序运行结果 OpenGL着色器语言(GLSL) 着色器是使用一种叫GLSL的类C语言写成的。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。着色器的开头总是要声明版本,接着是输入和...原创 2019-04-25 16:47:20 · 2451 阅读 · 0 评论 -
Python之OpenGL笔记(6):使用EBO绘制矩形
#一、目的1、使用EBO绘制两个三角形,组成矩形图形。#二、程序运行结果#三、索引缓冲对象(Element Buffer Object,EBO) 索引缓冲对象EBO相当于OpenGL中的顶点数组的概念,是为了解决同一个顶点多次重复调用的问题,可以减少内存空间浪费,提高执行效率。当需要使用重复的顶点时,通过顶点的位置索引来调用顶点,而不是对重复的顶点信息重复记录,重复调用。 EBO中...原创 2019-05-13 17:50:52 · 1173 阅读 · 0 评论 -
Python之OpenGL笔记(1):窗口工具包GLFW的安装
GLFW是一个窗口工具包下载GLFW。它可以在http://www.glfw.org/download.html 这个网页上下载。将下载的压缩文件glfw-3.2.1.bin.WIN32 (1).zip解压到我的文件夹内,D:\OpenGL\Glew文件夹\glfw-3.2.1.bin.WIN32 (1)\glfw-3.2.1.bin.WIN32。将GLFW的库文件位置添加到环境变量中的p...原创 2019-04-17 14:49:06 · 5301 阅读 · 2 评论 -
Python之OpenGL笔记(2):现代OpenGL编程常用的几个通用函数
#一、现代OpenGL:三维图形管线 OpenGL 应用编程接口(API)从固定功能的图形管线转为可编程的图形管线。 简化三维图形管线分为6步:##1、三维几何图形定义(VBO等) 在第一步,通过定义在三维空间中的三角形的顶点,并指定每个顶点相关联的颜色,我们定义了三维几何图形。##2、顶点着色器 接下来,变换这些顶点:第一次变换将这些顶点放在三维空间中,第二次变换将三维坐标投...原创 2019-06-19 20:47:40 · 3354 阅读 · 0 评论 -
Python之OpenGL笔记(3):使用OpenGL的图形渲染管线画三角形
着色器 在OpenGL中,任何事物都在3D空间中,而屏幕和窗口却是2D像素数组,这导致OpenGL的大部分工作都是关于把3D坐标转变为适应你屏幕的2D像素。3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,大多译为管线,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个...原创 2019-04-19 17:34:48 · 2843 阅读 · 4 评论 -
Python之OpenGL笔记(7):缩放变换
#一、目的1、使用GLSL实现图形的缩放。#二、程序运行结果#三、缩放变换 缩放变换非常简单,它的目的是增大或者缩小物体的尺寸。 二维空间坐标(x,y)以(0, 0)为中心在水平方向上缩放a倍,在垂直方向上缩放b倍,指的是变换后坐标位置距离(0,0)的水平距离变为原坐标离位置中心点的水平距离的a倍,垂直距离变为原坐标离位置中心点的垂直距离的b倍。 根据以上定义,(x,y)以(0...原创 2019-06-20 10:02:11 · 1599 阅读 · 0 评论 -
Python之OpenGL笔记(8):平移变换
一、目的1、使用GLSL实现图形的平移。二、程序运行结果三、平移变换 平移变换的任务是将一个对象沿着一个任意长度和方向的向量移动。 对于三维空间上的一点(x,y,z),我们使用4*4齐次矩阵的形式来表示平移变换: 使用四维向量来表示三维向量的做法称作齐次坐标,这对3D图形学来说普遍而又实用。向量的第四个分量称之为 “w” 。事实上,我们在以前教程中见到的着色器中的内置变量 g...原创 2019-06-21 10:34:56 · 1425 阅读 · 3 评论 -
Python之OpenGL笔记(12):画纹理四边形
一、目的1、画一个四边形并加载纹理。二、程序运行结果三、纹理 纹理是一个2D图片(甚至也有1D和3D的纹理),它可以用来添加物体的细节。 为了能够把纹理映射(Map)到四边形上,我们需要指定四边形的每个顶点各自对应纹理的哪个部分。这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采样。之后在图形的其它片段上进行片段插值(Fra...原创 2019-06-25 10:36:38 · 1934 阅读 · 0 评论 -
Python之OpenGL笔记(9):旋转变换
一、目的1、使用GLSL实现图形的旋转。二、程序运行结果三、旋转变换 旋转变换,就是说给定一个角度和点,我们将点绕着一个坐标轴旋转。在旋转过程中发生变化的总是x,y,z三个坐标里面的其中两个,而不让第三个坐标值变化。这意味着,旋转路径总在三个坐标轴平面中的一个之中:绕 Z 轴的是 xy 面、绕 X 轴的是 yz 面、绕 Y 轴的是 xy 面。当然还有许多复杂的旋转变换可以让你绕任意一个...原创 2019-06-22 14:18:41 · 1752 阅读 · 0 评论 -
Python之OpenGL笔记(10):变换综合应用
一、目的1、综合使用GLSL实现图形的平移、缩放、旋转。二、程序运行结果三、变换综合应用 对点进行先平移,在缩放,最后旋转操作,即将点坐标齐次矩阵与平移矩阵、缩放矩阵、旋转矩阵相乘得到的变换后的坐标。四、代码解析 程序中render(self,a,b,scale,r): 参数a,b表示x轴平移a,y轴平移b;缩放scale倍,然后绕Z轴旋转r度。五、源代码"""glf...原创 2019-06-23 09:28:12 · 630 阅读 · 0 评论 -
Python之OpenGL笔记(13):给立方体加纹理
一、目的1、给旋转的立方体加纹理。二、程序运行结果三、Z缓冲区 OpenGL存储它的所有深度信息于Z缓冲区(Z-buffer)中,也被称为深度缓冲区(Depth Buffer)。GLFW会自动为你生成这样一个缓冲区 (就如它有一个颜色缓冲区来存储输出图像的颜色)。深度存储在每个片段里面(作为片段的z值)当片段像输出它的颜色时,OpenGL会将它的深度值和z缓冲进行比较然后如果当前的片段...原创 2019-06-26 20:46:42 · 1760 阅读 · 0 评论 -
Python之OpenGL笔记(11):画一个立方体并自动旋转
一、目的1、画一个立方体并自动旋转。二、程序运行结果三、画立方体 画一个立方体,需要八个顶点的数据。一个正方体如何画出来,需要一个面一个面的画,那么正方体有6个面,而每个面呢?是一个正方形,我们把正方形划分为两个三角形,这个三角形是opengl中最小的片元了。 立方体有六个面,每个面两个三角形,也就是12个三角形,每个三角形3个顶点,于是要定义36个顶点。 使用语句glDraw...原创 2019-06-24 10:00:12 · 7510 阅读 · 4 评论 -
Python之OpenGL笔记(14):更多的立方体
一、目的1、现在我们想在屏幕上显示4个立方体。每个立方体看起来都是一样的,区别在于它们在世界的位置不同。二、程序运行结果三、GLSL 修改GLSL程序,对顶点进行旋转、平移、缩放操作。 修改rot1、rot2、rot3的乘的次序,会有不同的效果。四、源代码"""glfw_cube03.pyAuthor: dalong10Description: Draw 4 Cube, ...原创 2019-06-27 15:51:46 · 635 阅读 · 0 评论 -
Python之OpenGL笔记(16):旋转的光照钢边木箱
一、目的1、光照下的钢边木箱,学习光照基础、材质及光照贴图。二、程序运行结果三、光照基础1、环境光照(Ambient Lighting): 即使在黑暗的情况下,世界上也仍然有一些光亮(月亮、一个来自远处的光),所以物体永远不会是完全黑暗的。我们使用环境光照来模拟这种情况,也就是无论如何永远都给物体一些颜色。 把环境光照添加到场景里非常简单。我们用光的颜色乘以一个(数值)很小常量环...原创 2019-06-29 17:55:15 · 1405 阅读 · 1 评论 -
Python之OpenGL笔记(17):键盘鼠标控制摄像机移动旋转
一、目的1、键盘控制摄像机自由移动;2、鼠标控制摄像机旋转;3、鼠标滚轮放大缩小视野。二、程序运行结果三、自由移动view = lookAt(cameraPos, cameraPos + cameraFront, cameraUp)cameraPos为摄像机位置cameraPos + cameraFront为物体位置 当我们按下WASD键,摄像机的位置都会相应更新。如果我们希...原创 2019-07-05 11:47:09 · 4881 阅读 · 2 评论 -
Python之OpenGL笔记(18):正弦波的绘制
一、目的1、正弦函数的基本画法;2、GLSL方式实现练习。二、程序运行结果三、glDrawArrays 函数 GLSL画这些基本的类型使用的函数主要是glDraw*系列的函数:void glDrawArrays (GLenum mode, GLint first, GLsizei count); mode有以下类型,画点GL_POINTS,画线 GL_LINES,顺连线段G...原创 2019-07-12 11:18:05 · 1594 阅读 · 0 评论 -
Python之OpenGL笔记(19):正弦波叠加为方波的GLSL实现
一、目的1、正弦波叠加为方波的GLSL实现;二、程序运行结果三、正弦波合成方波的处理1、傅里叶函数分解方波公式: f(y) = 4/PI * (sinx+ sin3x/3 + sin5x/5 + …);2、实际程序里面公式为: f(y) = sinx+ sin3x/3 + sin5x/5 + …3、键盘控制 加入了正弦波合成方波的处理,使用箭头键移动正弦波,使用上下箭头进...原创 2019-07-19 10:23:56 · 2562 阅读 · 0 评论 -
Python之OpenGL笔记(4):使用不同的VAO、VBO和着色器画两个三角形
目的 1、创建相同的两个三角形,但对它们的数据使用不同的VAO和VBO:(类初始化实例时,初始数据生成不同的VAO)2、创建两个着色器程序,第二个程序使用与第一个不同的片段着色器;绘制这两个三角形,其中一个输出为绿色,一个输出为黄色:(类初始化实例时,根据side3的正负值,调用不同的片段着色器) 程序运行结果 顶点着色器 顶点着色器(Vertex Shad...原创 2019-04-22 14:58:50 · 1747 阅读 · 3 评论
分享