自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

王定桥的专栏

对知识保持敬畏之心,修行之路漫漫,不急不躁!

原创 数据结构与算法(Python)——常见数据结构Part5(二叉搜索树BST和AVL)

写在前面在上一节part4我们熟悉了二叉树结构,以及其遍历算法,本节将继续学习常见的树结构,包括二叉搜索树和一种自平衡的二叉搜索树AVL。1. 二叉搜索树二叉搜索树(Binary Search Tree):二叉查找树,也称二叉搜索树、有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)。它或者是一棵空树;或者是指具有如下性质的二叉...

2018-02-06 20:30:08 815 1

原创 数据结构与算法(Python)——常见数据结构Part4(二叉树)

写在前面在上一节part3我们熟悉队列结构,本节将熟悉应用广泛的树结构。我们的目的是快速了解他们,对于它们涉及到的复杂的数据结构和算法,在这里并不全部展开,留在后期详述。1. 树1.1 树的直观感受树是一个广泛应用的数据结构,即使未开始学习这个数据结构,我们在生活或者计算机中已经和它打交道好久了。首先让我们看几个树形的应用例子(图片来自What is the real li...

2017-12-21 17:31:02 893

原创 数据结构与算法(Python)——常见数据结构Part3(队列和循环队列)

写在前面在上一节part2我们熟悉了栈结构,本节继续对其他常见数据结构进行总结。我们的目的是快速了解他们,对于它们涉及到的复杂的数据结构和算法,在这里并不全部展开,留在后期详述。1. 队列1.1 一般队列同上一节栈类似,队列(Queue)结构也是插入和删除元素受到限制的线性结构。队列一般是一种只允许在线性结构的一端进行插入,另一端进行删除的结构,允许插入的一端称之为队尾(r...

2017-12-20 17:19:52 765

原创 数据结构与算法(Python)——常见数据结构Part2(栈和递归)

写在前面在上一节part1我们熟悉数组和链表,本节继续对其他常见数据结构进行总结。我们的目的是快速了解他们,对于它们涉及到的复杂的数据结构和算法,在这里并不全部展开,留在后期详述。1. 栈栈(stack)也是一种线性结构,与数组不同的是,栈限定了只能在线性表的一端,例如尾部进入插入或者删除操作(只允许头部操作类似)。栈类似于把车开入了一个死胡同,只剩下一端,只能从这个入口进入或...

2017-12-16 20:35:36 874

原创 数据结构与算法(Python)——常见数据结构Part1(数组和链表)

写在前面本节对常见数据结构做一个预览,我们的目的是快速了解他们,对于它们涉及到的复杂的数据结构和算法,在这里并不全部展开,留在后期详述。1.数组数组是我们要学习的第一个线性结构(Linear structure),所谓线性结构,指的是在数据有限集合中,每个数据元素都有一个确定的位置,例如a0a0a_{0}是第一个元素,an−1an−1a_{n-1}是最后一个元素,aiaia_{i}...

2017-12-09 14:24:14 3524

原创 数据结构与算法(Python)-一般概念和算法效率分析

写在前面前面学习完了Python基础内容后,从本节开始正式学习数据结构与算法相关内容。这是一个比较复杂的主题,一般分为初级、高级、以及专门的算法分析三个阶段来学习,因此我们也需要循序渐进。本节主要熟悉数据结构与算法中一般概念,然后熟悉算法效率分析的大O记法,知识结构如下图所示:什么是算法?1)算法的定义算法(Algorithm),指的是对特定问题求解步骤的一种描述。 在数学上,它是运算步骤的有限序

2017-09-24 15:50:25 2633

原创 数据结构与算法(Python)-Python快速入门篇4

写在前面本节是Python入门篇的最后一篇了,通过本节我们将会熟悉Python模块、包的使用,同时了解和养成书写Pythonic代码的习惯。主要内容如下图所示:模块和包1) 模块的定义和名字在Python中一个脚本(Script)是一个将要被当做主模块(main)执行的python文件。模块(Module)是一个以.py结尾的python文件,在文件中我们定义了函数、类,准备以后重用这些代码块。Py

2017-09-18 13:10:57 1451

原创 数据结构与算法(Python)-Python快速入门篇3

写在前面对于简单的任务,我们可以利用一些函数,按照任务处理的流程书写代码来完成需求,这种方式称之为过程式编程(procedural programming);但是对于复杂的系统,如何有条理的将每个模块的代码内聚起来,如何清晰和简洁地表达各个模块之间的交互,就需要一种新的指导思想,面向对象编程(object-oriented programming)。OOP强调的就是为独立模块构造对象,对象之间通过消

2017-09-10 18:58:29 2191

原创 数据结构与算法(Python)-Python快速入门篇2

写在前面紧接着上一节python入门1,本节还是继续学习Python的必备知识。具体的知识结构图如下所示:函数和作用域1)函数定义python中函数定义由关键字def开始,例如定义一个产生斐波拉契数列的函数如下:def fib(n): """Print a Fibonacci series up to n.""" a, b = 0, 1 while a < n: pr

2017-09-03 16:18:22 3718

原创 数据结构与算法(Python)-python快速入门篇1

写在前面python语言以其语法简洁(代码量比java开发的程序少3-5倍,比c++少5-10倍[^1])、快速原型开发(prototyping)以及庞大第三方库的支持,广泛应用于多个领域,成为了一门很流行的语言。我们这里使用Python,可以抛开其他像C++/java这些语言本身的复杂性,把精力集中在数据结构和算法的思考上。同时在完成一般性的数据结构与算法的学习后,熟练掌握Python后,也可以将

2017-08-27 16:16:37 6841

原创 数据结构与算法(Python)-前篇

接触计算机学习已经9年了,零零碎碎学习了很多理论和技术,现在回过头来才发现,能够培养计算机专业素养的基础学科也就那么多,其中数据结构和算法分析,就是一个核心课程。在实际工作过程中,很多时候会遇到庞大的业务需求,项目计划排的满满的,项目进度一直在和市场上同类竞争产品赛跑。一般开发人员的日常都被繁琐的业务塞的满满的,好在只要熟悉了公司的框架和流程后,也就驾轻就熟,慢慢适应了。有时候并不需要什么高深的算法

2017-08-27 11:40:39 1177

原创 OpenGL学习脚印:伽马校正(Gamma Correction)

写在前面 由于CRT,LED等显示设备显示颜色时并非按照线性方式工作,因此我们在程序中输出的颜色,最终输出到显示器上时会产生亮度减弱的现象,这种现象在计算光照和实时渲染时对图形质量有一定影响,需要我们加以处理。本节将熟悉Gamma校正的概念,并通过点光源的示例来表现Gamma校正对图形效果的影响。本节示例代码均可以在我的github下载。为什么需要γ\gamma校正我们在图形程序中认为(1.

2016-10-30 21:35:29 6813

原创 OpenGL学习脚印:Blinn-Phong光照模型

写在前面 在前面基础光照部分,我们学习了Phong Shading模型,Blinn-Phong模型对Phong模型的镜面光成分进行了改进,虽然在物理上解释没有Phong好,但是能更好地模拟光照。本节代码可以在我的github下载。 本节内容整理自: 1.www.learnopengl.com 2.Blinn-Phong ModelPhong不能处理的情况我们知道,Phon

2016-10-29 16:01:56 6960

原创 OpenGL学习脚印: 反走样初步(Anti-aliasing basic)

写在前面 目前,我们绘制的图形中存在瑕疵的,观察下面这个立方体: 仔细看,立方体的边缘部分存在折线,如果我们放大了看,则可以看到这种瑕疵更明显:这种绘制的物体边缘部分出现锯齿的现象称之为走样(aliasing)。反走样(Anti-aliasing)是减轻这种现象的方法。反走样本身也是一个比较复杂的主题,深入了解需要有信号处理中的背景知识,例如信号采样、信号重构、滤波等知识,本节作

2016-10-16 16:17:28 6169

原创 OpenGL学习脚印:创建更多的实例(instancing object)

写在前面 前面我们学习了模型加载的相关内容,并成功加载了模型,令人十分兴奋。那时候加载的是少量的模型,如果需要加载多个模型,就需要考虑到效率问题了,例如下图所示的是加载了400多个纳米战斗服机器人的效果图:渲染一个模型更多的实例,需要使用到实例化技术,就是本节要介绍的instancing object方法。本节示例代码均可以从我的github下载。 本节内容整理自: www.l

2016-10-04 14:23:40 5988

原创 OpenGL学习脚印:几何着色器(geometry shader)

写在前面 一直以来我们使用了顶点着色器(vertex shader)和片元着色器(fragment shader),实际上OpenGL还提供了一个可选的几何着色器(geometry shader)。几何着色器位于顶点和片元着色器之间,如果没有使用时,则顶点着色器输出到片元着色器,在使用几何着色器后,顶点着色器输出组成一个基础图元的顶点信息到几何着色器,经过几何着色器处理后,再输出到片元着色

2016-10-02 22:46:36 12307 3

原创 OpenGL学习脚印: uniform blocks在着色器中的使用

写在前面 目前,我们在着色器中要传递多个uniform变量时,总是使用多个uniform,然后在主程序中设置这些变量的值;同时如果要在多个shader之间共享变量,例如投影矩阵projection和视变换矩阵view的话,仍然需要为不同shader分别设置这些uniform变量。本节将为大家介绍interface block,以及基于此的uniform buffer object

2016-10-01 19:18:56 5771

原创 OpenGL学习脚印:缓冲对象相关函数的使用(buffer object function usage)

写在前面 OpenGL中还包含除了我们前面介绍的VAO,VBO,EBO等其他类型的缓冲对象。关于如何使用这些缓冲对象的手册或者参考书籍上解释得非常详细,但是阅读起来确实很枯燥无味。 本文将通过简洁、可靠的例子说明一些重要方法的使用,以辅助学习这些方法。本文的目的不是写成详细而厚重的手册,对于文中未详细说明的部分,请参考官方文档。 学习这些内容的过程需要随着实践慢慢积累,因此本

2016-09-25 17:00:00 6575 2

原创 OpenGL学习脚印: 环境纹理映射(environment mapping)

写在前面 上一节初步学习了使用cubeMap创建天空包围盒,本节继续深入Cubemap这个主题,学习环境纹理贴图。本节示例程序均可以从我的github下载。 本节内容整理自: 1.www.learnopengl.com cubemaps环境纹理贴图同上一节的Cubemap创建天空包围盒有些类似,创建环境纹理贴图也是对当前待渲染物体,从包围的环境纹理上采样作为这个物体的纹理而渲染

2016-09-16 21:41:40 7112 5

原创 OpenGL学习脚印:立方体纹理和天空包围盒(Cubemaps And Skybox)

写在前面 之前学习了2D纹理映射,实际上还有其他类型的纹理有待我们进一步学习,本节将要学习的立方体纹理(cubemaps),是一种将多个纹理图片复合到一个立方体表面的技术。在游戏中应用得较多的天空包围盒可以使用cubemap实现。本节示例程序均可以在我的github下载。 本节内容整理自: 1.Tutorial 25:SkyBox 2.www.learnopengl.

2016-09-11 22:14:44 13694 4

原创 OpenGL学习脚印: 帧缓冲对象(Frame Buffer Object)

写在前面 一直以来,我们在使用OpenGL渲染时,最终的目的地是默认的帧缓冲区,实际上OpenGL也允许我们创建自定义的帧缓冲区。使用自定义的帧缓冲区,可以实现镜面,离屏渲染,以及很酷的后处理效果。本节将学习帧缓存的使用,文中示例代码均可以在我的github下载。 本节内容整理自 1.OpenGL Frame Buffer Object (FBO) 2.www.learn

2016-09-03 14:42:29 8700 1

原创 OpenGL学习脚印:背面剔除(Face Culling)

写在前面 在绘制封闭类型的几何对象时,开启背面剔除功能能够提高渲染性能。本节简要介绍下背面剔除。什么是背面剔除当我们观察场景中对象时,一般只能以一定角度来观察,那么对象的某些面我们是看不到的,例如你观察一个立方体,最多只能同时看到3个面,有时只能看到1个面,而我们绘制时如果不采取剔除背面的措施,则要绘制6个面,其中包括一些,我们根本看不到的面。对于立方体这个面较少的几何对象,性能开销不明显

2016-08-21 14:56:46 9714

原创 OpenGL学习脚印:混色(Blending)

写在前面 上一节学习了使用模板缓冲来制作特殊效果,本节将继续学习一个高级主题-混色(Blending)。通过使用混色,我们可以制作透明、半透明效果。本节示例代码均可以在我的github下载。 本节内容整理自www.learnopengl.com blending.混色的概念所谓混色,就是将当前要绘制的物体的颜色和颜色缓冲区中已经绘制了的物体的颜色进行混合,最终决定了当前物体的颜色。例如下

2016-08-21 00:00:37 3467

原创 OpenGL学习脚印:深度测试(depth testing)

写在前面 上一节我们使用AssImp加载了3d模型,效果已经令人激动了。但是绘制效率和场景真实感还存在不足,接下来我们还是要保持耐心,继续学习一些高级主题,等学完后面的高级主题,我们再次来改进我们加载模型的过程。本节将会学习深度测试,文中示例程序源代码均可以在我的github下载。 本节内容整理自 1.www.learnopengl.com Depth testing 2.de

2016-08-14 21:40:25 18968 1

原创 OpenGL学习脚印:模板测试(stencil testing)

写在前面 上一节介绍了深度测试,本节继续学习一个高级主题-模板测试(stencil testing)。模板缓冲同之前介绍的颜色缓冲、深度缓冲类似,通过它我们可以实现很多的特效,例如轮廓、镜面效果,阴影效果等。本节示例程序均可以从我的github下载。通过本节可以了解到模板缓冲的作用模板缓冲的使用方法-简单的矩形模板模板缓冲实现的outline和refleciton效果模板缓冲的作用上一节介

2016-08-08 09:04:53 13784 1

原创 OpenGL学习脚印-AssImp模型加载

写在前面 上一节Obj模型加载作为模型加载的基础篇,介绍了模型中Mesh的概念,以及从Obj模型文件转换为OpenGL数据格式的方法。上一节绘制的结果还是很简陋,本节将给出上节承诺的酷炫的3D模型的加载方法:)。本节示例程序均可以在我的github下载。 本节内容参考自 1.www.learnopengl.com Model loading 2.Loading mode

2016-07-24 17:16:24 23135 41

原创 OpenGL学习脚印:模型加载初步-加载obj模型(load obj model)

写在前面 前面介绍了光照基础内容,以及材质和lighting maps,和光源类型,我们对使用光照增强场景真实感有了一定了解。但是到目前为止,我们通过在程序中指定的立方体数据,绘制立方体,看起来还是很乏味。本节开始介绍模型加载,通过加载丰富的模型,能够丰富我们的场景,变得好玩。本节的示例代码均可以在我的github下载。加载模型可以使用比较好的库,例如obj模型加载的库,Assimp加载库。本节作

2016-07-12 00:12:06 35255 14

原创 OpenGL学习脚印:光源类型和使用多个光源(Light source and multiple lights)

写在前面 上一节光照中使用材质和lighting maps介绍了使用材质属性和lighting maps使物体的光照效果能反映物体的材料特性,看起来更逼真。在前面的章节中使用的实际上都是一个点光源,本节将学习其他几种光源类型,以及在场景中使用多个光源。本节代码均可以在我的github下载。 本节内容整理自: 1.www.learnopengl.com light caste

2016-07-09 17:11:11 11969 2

原创 OpenGL学习脚印: 光照中材质和lighting maps使用(material and lighting maps)

写在前面 这一节隔了好久了,今天终于有时间写完。上一节光照基础学习实现了Phong reflection model,但是还存在不足,本节使用材质属性,以及使用diffuse map和specular map改善上一节的实现。本节示例程序均可以在我的github下载。 本节内容整理自: 1.www.learnopengl.com Materials 2.www.learnopeng

2016-07-03 23:56:38 7292

原创 OpenGL学习脚印: 光照基础(basic lighting)

写在前面 上一节坐标变换过程,总结了OpenGL中顶点的处理过程。有了前面的基础,从本节开始,我们可以开始学习OpenGL中包括光照、模型加载等主题。光照是一个复杂的主题,本节学习简单的Phong reflection model.本节示例程序均可以在我的github下载。 本节内容整理自: 1. learnopengl.com Basic Lighting 2.Modern

2016-06-12 23:39:49 11062 5

原创 OpenGL学习脚印: 坐标变换过程(vertex transformation)

写在前面 前面几节分别介绍了模型变换,视变换,以及给出了投影矩阵和视口变换矩阵的推导,本节从全局把握一遍OpenGL坐标转换的过程,从整体上认识坐标变换过程。相关矩阵的数学推导过程请参考前面几节对应的内容。通过本节可以了解到坐标变换的各个阶段利用GLM数学库实现坐标变换坐标变换的全局图OpenGL中的坐标处理过程包括模型变换、视变换、投影变换、视口变换等过程,如下图所示: 在上面的图

2016-06-06 15:27:59 22048 6

翻译 OpenGL学习脚印: 投影矩阵和视口变换矩阵(math-projection and viewport matrix)

写在前面 前面几节分别介绍了模型变换,视变换,本节继续学习OpenGL坐标变换过程中的投影变换。这里主要是从数学角度推导投影矩阵。对数学不感兴趣的,可以稍微了解下,或者跳过本节内容。本文主要翻译并整理自 songho OpenGL Projection Matrix一文,这里对他的推导思路稍微进行了整理。通过本节可以了解到透视投影矩阵的推导正交投影矩阵的 推导视口变换矩阵的推导zF

2016-06-05 18:06:42 35349 14

原创 OpenGL学习脚印: 欧拉角实现第一人称相机(FPS camera with Euler angle)

写在前面 上一节视变换(view transformation) ,介绍了相机的设置参数,并建立了圆形坐标系和球形坐标系下的相机位置随着时间改变的绘制立方体程序。程序中用户无法通过键盘和鼠标来和场景中物体交互,本节实现一个第一人称相机来更好地与场景中物体交互。本节代码可以在我的github下载。通过本节可以了解到欧拉角第一人称相机的实现欧拉角和相机在一节中,我们设置相

2016-06-04 21:40:50 14225 4

原创 OpenGL学习脚印: 视变换(view transformation)

写在前面 OpenGL中的坐标处理过程包括模型变换、视变换、投影变换、视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习。上一节模型变换,本节学习模型变换的下一阶段——视变换。到目前位置,主要在2D下编写程序,学习了视变换后,我们可以看到3D应用的效果了。本节示例程序均可在我的github下载。通过本节可以了解到视变换的概念索引绘制立方体LookAt矩阵的推导(对

2016-06-03 17:44:44 15425 6

原创 OpenGL学习脚印: 模型变换(model transformation)

写在前面 前面为本节内容准备了向量和矩阵、线性变换等内容,本节开始学习OpenGL中的坐标处理。OpenGL中的坐标处理过程包括模型变换、视变换、投影变换、视口变换等内容,这个主题的内容有些多,因此分节学习,主题将分为5节内容来学习。本节主要学习模型变换。本节示例代码均可在我的github处下载。通过本节可以了解到模型变换的作用模型变换的类型和计算方法坐标处理的全局过程(了解,另文详

2016-05-29 17:12:55 18781 4

原创 OpenGL学习脚印: 二维纹理映射(2D textures)

写在前面 前面两节介绍了向量和矩阵,以及坐标和转换相关的数学,再继续讨论模型变换等其他包含数学内容的部分之前,本节介绍二维纹理映射,为后面学习做一个准备。纹理映射本身也是比较大的主题,本节只限于讨论二维纹理的基本使用,对于纹理映射的其他方法,后面会继续学习。可以从我的github下载本节代码。通过本节可以了解到纹理映射的概念和原理二维纹理映射的处理方法使用纹理增加物体表面细节要使渲染

2016-05-20 17:17:59 44556 18

原创 OpenGL学习脚印: 坐标和变换的数学基础(math-coordinates and transformations)

写在前面 上一节介绍了向量和矩阵,本节将熟悉坐标、线性变换、仿射变换以及坐标转换等概念和计算方法,这些内容对后续的学习将会有很大帮助。部分内容不是OpenGL编程初学者所必须掌握的,可以在以后需要时再回头来看。这里是对这些知识点的一个总结,旨在对他们有个整体把握,后面具体应用时会使用这些概念。内容尽量以例子形式说明,仅在必要时会给出数学证明。一个主题往往涉及过多内容,对于文中省略的

2016-05-18 20:35:48 14500 4

原创 OpenGL学习脚印: 向量和矩阵要点(math-vector and matrices)

写在前面 前面几节内容环境搭建,绘制三角形,以及使用索引绘制,让我们对现代OpenGL中绘图做了简单了解。要继续后面的部分,需要熟悉OpenGL中涉及的数学知识。因此本节开始介绍OpenGL中的基本数学。介绍这部分内容的主旨在于对OpenGL涉及的数学有个整体把握,重点把握一些概念在OpenGL中的应用。内容尽量以例子形式说明,仅在必要时会给出数学证明。一个主题往往涉及过多内容,对于文中省略的部分

2016-05-12 21:48:19 18828 5

原创 OpenGL学习脚印: 使用索引绘图(index drawing)

写在前面 上一节熟悉了OpenGL绘图的中基本的VAO和VBO,以及着色器,并绘制了一个三角形。本节在上一节基础上,介绍利用EBO的索引绘图。通过本节可以了解到索引绘图使用方法索引绘图应用场合使用EBO开始索引绘图EBO即Element Buffer Objects,用来存储绘制物体的索引。所谓索引就是对顶点属性数组中元素的一个位置标记。使用索引绘图时,先通过顶点属性数

2016-05-05 17:06:13 9658 5

原创 OpenGL学习脚印: 绘制一个三角形

写在前面 接着上一节内容,开发环境搭建好后,我们当然想立即编写3D应用程序了。不过我们还需要些耐心,因为OpenGL是一套底层的API,因而我们要掌握的基本知识稍微多一点,在开始绘制3D图形之前,本节我们将通过绘制一个三角形的程序来熟悉现代OpenGL的概念和流程。通过本节可以了解到:缓存对象VAO和VBOGLSL着色器程序的编译、链接和使用方法OpenGL绘图的基本流程绘

2016-05-04 23:10:17 26823 15

提示
确定要删除当前文章?
取消 删除