OpenGL编程指南
文章平均质量分 79
snail_hunan
这个作者很懒,什么都没留下…
展开
-
OpenGL 3.0贴纹理
OpenGL 3.0 贴纹理1. 把shader程序放置到GPU上2. 把顶点数据传送到GPU上3. 把纹理数据传送到GPU上4. 绘制图形本文讲述如何使用OpenGL 3.0进行贴纹理。分如下4个部分进行:把shader程序放置到GPU上。把顶点数据传给GPU。把纹理数据传给GPU。开始绘制。1. 把shader程序放置到GPU上shader程序分成vertex shader 和 fragment shader,vertex shader程序代码如下:#version 330 cor原创 2021-07-25 21:16:59 · 353 阅读 · 0 评论 -
OpenGL 缓存对象(Buffer Object) 解析
缓存对象(Buffer Object)简介OpenGL Buffer Object(缓存对象,简写BO),是OpenGL管理的一段内存,为了与我们CPU的内存区分开,一般叫OpenGL管理的内存,叫显存。为了区分内存与显存,我这里从京东上搜索了内存条与显卡,如下图,这是一张显卡的截图,显卡使用的DDR为GDDR5,就是我们的显存,这个2G就表示这个显存的大小为2G。再看内存,内存条,下面的内存条,使用的是DDR4,这里有2根,容量大小为8GB。内存,是通过PCIE插槽,插在主板上的,也就是位于主原创 2021-04-19 23:21:37 · 1766 阅读 · 0 评论 -
gl3w解析
我在学习《OpenGL编程指南》第9版,第一个例子程序,是画2个三角形triangs,里面用到了gl3w。这里就来解析一下,这个gl3w。gl3w 简介gl3w是用来加载OpenGL核心模式(core profile)的。所谓核心模式,就是OpenGL编写shader程序,需要使用的那些函数, gl3w就是用来加载这些函数的。可以理解成gl3w就是用来加载OpenGL 3.0以后的函数的。gl3w 组成gl3w,就2个文件组成,一个gl3w.h和一个gl3w.c文件。实际使用的时候,可以把gl3w.原创 2021-04-18 20:34:06 · 1344 阅读 · 1 评论 -
GLFW的hello world
最近在学opengl,使用的《OpenGL编程指南》第9版,其中第一个例子,就是基于glfw库创建的,所以先了解一下glfw这个库,对于后续OpenGL开发是有帮助的。GLFW 简介GLFW 是一个开源的,跨平台的库,可以用于桌面环境的OpenGL, OpenGL ES和Vulkan开发。它提供了简单的API,用来创建窗口,上下文和Surface,接收输入和事件。GLFW是用c语言编写的,支持Windows, macOS, X11和Wayland。以上翻译自glfw官网,想了解更多的,请移步到该网址原创 2021-04-18 11:15:45 · 249 阅读 · 0 评论 -
2.7 缓冲区对象
缓冲区对象简介什么是缓冲区对象?缓冲区,通常是指一个内存块。而缓冲区对象呢?则是指位于图形服务器中的内存块。这样的内存块,通常都会用一个无符号的整型数值,对它进行标识。这个无符号整型标识,叫做缓冲区对象的名称。图形服务器? OpenGL是按照客户机-服务器模式设计的,在OpenGL需要数据的任何时候,都必须把数据从客户机内存传输到服务器。缓冲区对象,允许应用程序显式地指定把哪些数据存储在图形服务器原创 2015-03-11 21:00:58 · 994 阅读 · 0 评论 -
2.6 顶点数组
顶点数组,顾名思义,就是存放顶点的数组。为什么使用顶点数组?为什么要将顶点存放到数组中啊?方便管理,省事。之前是这样指定物体的顶点的:glBegin(GL_POLYGON); glVertex2f(0.0, 0.0);//顶点A glVertex2f(0.0, 3.0);//B glVertex2f(4.0, 3.0);//C glVertex2f(4.0, 0.0)原创 2015-03-08 19:18:02 · 949 阅读 · 0 评论 -
3.5 和变换相关的故障排除
这个,其实就是熟悉整个坐标变换过程。熟悉了之后,挨个步骤确定正确与否。 从系统开机,到最后的投影变换。逐步确认。 1. 检查一些显而易见的原因。系统是否已经插上电?绘图颜色是否和用来清除背景颜色相同?程序所使用的各种状态(例如光照、纹理、Alpha混合、逻辑操作或抗锯齿)是否已经正确地打开或关闭? 2. 物体是否位于视景体范围以内?因为视景体范围之外的物体,会被裁剪掉。 3. 确定观察点的位原创 2015-03-17 21:36:02 · 506 阅读 · 0 评论 -
2.2 描述点、直线和多边形
点、直线和多边形,在OpenGL中属于基本图元,由于这些图元是几何体,又叫几何图元。 在OpenGL中,又是如何描述这些几何图元的呢?单个的点,直接给出点的坐标即可。一条直线,我们知道,两点确定一条直线,所以直线也可以用点来描述。而多边形呢?也是通过多边形的顶点来描述的,通过将顶点连成线,然后连线的封装区域就是这个多边形。所以OpenGL中,所有的几何图元都是根据它们的顶点来描述。什么是点、直线和原创 2015-03-06 22:43:17 · 685 阅读 · 0 评论 -
2.5 法线向量
向量,是有大小和方向的量。而法线向量则是垂直于某个表面的方向向量。法线向量可以用来干什么?物体的法线向量定义了它的表面在空间中的方向。这个方向能干什么用?定义了它相对于光源的方向。举个例子,镜子可以通过反射,改变光的传播方向。拿着镜子朝着阳光,然后在墙壁上就可以看到一个被反射的光圈。小时候,拿着镜子,反射太阳光,不断的调整镜子的朝向,使得最后镜子反射的光线, 射入到某个女生的眼睛里去,然后我还洋洋得原创 2015-03-08 12:02:37 · 5158 阅读 · 0 评论 -
2.9 属性组
在2.3节中,我们学到了如何设置或查询一个单独的状态或状态变量。也可以用一个命令保存或恢复一组相关的状态变量的值。OpenGL将相关的状态变量进行归组,称为属性组(attribute group)。例如,GL_LINE_BIT属性包括了5个状态变量:直线的宽度、GL_LINE_STIPPLE启用状态、直线点画模式、直线点画重复计数器和GL_LINE_SMOOTH启用状态。使用glPushAttrib原创 2015-03-12 19:26:32 · 648 阅读 · 0 评论 -
2.8 顶点数组对象
什么是顶点数组对象?上一节介绍了缓冲区对象,缓冲区就是个内存块,缓冲区对象 = 图形服务器中的内存块 + 一个ID。 顶点数组,是为了减少函数调用数量,为了避免共享顶点的冗余,而将顶点放在数组中。 那顶点数组对象呢?顶点数组对象,就是 顶点数组 + 一个ID名称。然后通过这个名称,来对这个顶点数组进行访问。为什么要使用顶点数组对象?为了方便在不同的顶点数组之间进行切换。由于顶点数组,同一个类型的原创 2015-03-12 19:22:07 · 1437 阅读 · 0 评论 -
2.10 创建多边形表面模型的一些提示
终于看到本章的最后一节了。这一节讲了一些提示,这些提示在我们创建物体表面的时候,有用。 下面是创建多边形模拟物体表面的6条提示:多边形的方向(环绕)保持一致。从外侧观察表面时,确保组成这个表面的所有多边形都具有相同的方向(都为顺时针或都为逆时针)。 一致的方向对于多边形剔除和双面光照是极为重要的。对表面进行细分时,要密切注意哪些非三角形的多边形,确保多边形所有顶点位于同一个平面上。具有3个顶原创 2015-03-12 20:08:26 · 827 阅读 · 0 评论 -
3.1 简介:用照相机打比方
开始第3章的学习啦。这一章,很重要的。主要讲解视图,讲OpenGL将物体描述呈现在屏幕上的整个过程。这个成像的过程,有点像照相机照相: 1. 把照相机固定在三脚架上,并让它对准场景(视图变换)。 2. 对场景进行安排,使各个物体在照片中的位置是我们所希望的(模型变换)。 3. 选择照相机镜头,并调整放大倍数(投影变换)。 4. 确定最终照片的大小。例如,我们很可能需要把它放大(视口变换)。整原创 2015-03-13 21:47:46 · 617 阅读 · 0 评论 -
3.6 操作矩阵堆栈
OpenGL中的矩阵堆栈有3个,它们分别是模型视图矩阵堆栈,投影矩阵堆栈,纹理矩阵堆栈。 矩阵堆栈的结构如上图所示。就是数据结构中的栈,栈中的元素是一个4*4的矩阵。各个堆栈所能容纳的矩阵最大个数不一样。模型视图矩阵堆栈容纳32个,投影矩阵堆栈容纳2个,纹理矩阵堆栈,这里没说。但是可以通过调用一个函数,去获取矩阵堆栈的最大矩阵个数。glGetIntegerv(GL_MAX_MODELVIEW_原创 2015-03-24 19:50:52 · 910 阅读 · 0 评论 -
3.7 其他裁剪平面
之前了解到,OpenGL的视景体定义了一个裁剪区域,只有区域内的物体,才可见。OpenGL除了视景体可以裁剪外,还可以自己定义裁剪平面,对物体进行裁剪。裁剪平面如何表示呢?通过一个方程:Ax + By + Cz + D = 0,然后我们只需要指定A,B,C,D的值,就可以表示一个平面了。裁剪平面有多少个呢?所有OpenGL的实现,都必须支持至少6个其他的裁剪平面,有些实现可能允许超过6个的其他裁剪平原创 2015-03-24 20:51:32 · 403 阅读 · 0 评论 -
VBO的使用
VBO的定义VBO,全称Vertex Buffer Object,中文名叫顶点缓冲区对象,是位于显卡中的一块内存区,这个内存区存放的是顶点相关的数据,比如坐标、颜色、法向量等。相关概念Buffer Object,缓冲区对象,即显卡中的一块内存区。这个内存区可以存放不同的东西,当存放顶点相关的数据时,就是上面的顶点缓冲区对象VBO。当这个内存区存放Uniform变量的时候,就叫统一缓冲区对象(Unif原创 2015-05-26 06:39:20 · 1155 阅读 · 0 评论 -
2.3 基本状态管理
这一小节,主要讲解OpenGL的基本状态管理,其实这些内容,在1.4节 OpenGL是一个状态机的时候,已经提到过。OpenGL是一个状态机,有众多的状态变量,它会一直处于一个状态,直到我们修改它的状态。然后它的输出,是由输入和状态共同决定的。OpenGL有哪些状态呢?最常见的就是OpenGL的颜色,其次是一些光照、纹理、隐藏表面消除、雾以及其他影响物体外观的状态。这么多状态,如何对状态进行管理,成原创 2015-03-07 08:51:56 · 412 阅读 · 0 评论 -
2.4 显示点、直线和多边形
这一小节主要描述点、直线、多边形的属性,通过这些属性,控制点、直线、多边形的显示方式。内容有点多。点的细节这里只描述了点的一个属性,点的大小,可以通过glPointSize函数来控制。然后通过glGetFloatv来进行查询。其中点的大小,还有抗锯齿和非抗锯齿之分。void glPointSize(GLfloat size);这个函数的参数,表示点的大小,单位是像素。size必须大于0.0,默认情况原创 2015-03-07 12:11:24 · 857 阅读 · 0 评论 -
1.3 OpenGL函数的语法
OpenGL中除了函数之外,还有一些常量,这些常量以宏的形式表达。宏的命名以GL_开头,然后所有字母大写,单词之间用下划线‘_’分割。OpenGL中的函数,函数名如 glVertex3f,通常有前缀和后缀。函数前缀函数的前缀只有一个,就是gl,然后首字母大写。这个前缀可以很好的将OpenGL的函数 和 自己写的函数区分开。这个前缀可以表示函数属于哪一个库,比如glutInit表示原创 2015-02-23 11:54:25 · 486 阅读 · 0 评论 -
1.2 一段简单的OpenGL程序
这一节给了一段OpenGL程序,但是这段程序是用伪代码写的,不能直接运行。后来在1.6节找到了可以直接运行的程序。#include void display(){ glBegin(GL_POLYGON); //下面要绘制的是多边形 glVertex3f(0.25, 0.25, 0.0); //多边形的顶点1 glVertex3f(0.75, 0.25, 0.0); //顶点2原创 2015-02-22 09:33:04 · 1254 阅读 · 3 评论 -
1.4 OpenGL是一个状态机
OpenGL是一个状态机。状态机就是状态转移图。举个最简单的例子。人有三个状态健康,感冒,康复中。触发的条件有淋雨(t1),吃药(t2),打针(t3),休息(t4)。所以状态机就是健康-(t4)->健康;健康-(t1)->感冒;感冒-(t3)->健康;感冒-(t2)->康复中;康复中-(t4)->健康,等等。就是这样状态在不同的条件下跳转到自己或不同状态的图。状态机的分类状原创 2015-02-24 15:38:16 · 780 阅读 · 0 评论 -
1.5 OpenGL渲染管线
先来解释渲染管线。渲染是一个过程,将对物体的描述转换成图像的过程。管线,又叫流水线,通常为了完成一项比较大的任务,将任务分成很多小步骤,没一步做完该步骤的事之后,又交给下一个步骤做,直到最终完成。这一系列步骤就叫流水线。OpenGL渲染管线,是指将图形描述转换成图像过程中,一系列相关的处理阶段。下面是书中的渲染管线图。这个图中的内容很多,书中建议首次接触的时候,跳过,以后每看完原创 2015-02-24 21:11:01 · 579 阅读 · 0 评论 -
3.2 视图和模型变换
视图变换,是指变换照相机的位置,角度。 模型变换,是指变换被照物体的位置,角度。这两个变换,都会影响最终图形中,物体的位置,角度。而这两个变换,可以达到相同的效果。比如,你想要一个倒着的水杯图形,可以把你自己倒立,这样看到的水杯就是倒立的了。或者把水杯倒立,自己直立,也能看到倒立的水杯。 如图所示,这两种变换,可以看做达到目的的不同途径。甚至可以同时使用视图变换和模型变换,只要最终拿到了我们原创 2015-03-15 18:08:12 · 1844 阅读 · 0 评论 -
3.8 一些组合变换的例子
这一小节主要是两个例子:创建太阳系模型,创建机器人手臂。 这两个例子,主要用来讲解如何对视图模型进行变换。3.8.1 创建太阳系模型/** planet.c* This program shows how to composite modeling transformations* to draw translated and rotated models.* Interactio原创 2015-03-25 20:09:07 · 907 阅读 · 0 评论 -
1.6 与OpenGL相关的函数库
与OpenGL相关的函数库与OpenGL相关的函数库,主要有下面几种。1. GLU库。这个库叫OpenGL工具函数库。这个函数库中的函数,全用glu开头,比如gluLookAt。这个库使用底层的OpenGL函数,来执行一些特定的任务。比如gluLookAt就是使用glTranslate和glRotate来完成功能的。说白了,就是对OpenGL库稍微封装一下,就形成了GLU库。2. GL原创 2015-03-02 21:03:13 · 508 阅读 · 0 评论 -
1.7 动画
动画是由一副一副静止的画面组成的,通过在静止画面之间快速切换,比如1秒钟切换24副画面,而这24副画面之间的差别较小,这样我们的大脑会将前一副画面和后一副画面连接起来,形成平滑的动画。小时候的连环画,就有点动画的意思了,快速翻看连环画,就看到画面仿佛动起来了。双缓冲由于计算机程序没有那么多的纸张来描画静止画面,它只有一个显示屏,所以就导致两幅画面切换之前,需要擦除原来的画面,然后画原创 2015-03-03 18:35:23 · 453 阅读 · 0 评论 -
3.9 逆变换和模拟变换
逆变换,就是OpenGL变换的逆过程。OpenGL是将三维坐标,转换成屏幕坐标。而逆变换,就是将屏幕坐标,转换为三维坐标。在逆变换过程中,同样需要正变换中的那些参数,这些参数有三个: 模型矩阵, 投影矩阵,视口。逆变换,使用的函数叫gluUnProject,这个是相对于标准深度值的。还有一个函数,叫gluUnProject4,是相对于非标准深度值的。所谓标准深度值,是指深度值范围为[0, 1]。深度原创 2015-03-25 20:45:22 · 685 阅读 · 0 评论 -
1.8 OpenGL及其废弃机制
OpenGL不断的发展,势必导致老的要淘汰,新的要出来。在这个发展的过程中,在发展到3.0版本的时候,Khronos OpenGL ARB工作组制定了一种废弃模式,该模式说明了如何从API中删除功能。然而,这一删除不只是需要修改核心OpenGL API,它也影响到如何创建OpenGL渲染环境以及可用的OpenGL渲染环境的类型。也就是说,在去旧留新的过程中,OpenGL所以来的渲染环境都发生了原创 2015-03-04 19:18:55 · 892 阅读 · 0 评论 -
3.3 投影变换
投影变换的目的是定义一个视景体。视景体定义了场景的可视范围,以及场景如何投射到屏幕上。投影有两种:透视投影 和 正交投影。相关的函数有4个: GL库中两个, GLU库中两个。 GL库中的两个分别为glFrustum和glOrtho,GLU库中的两个分别为gluPerspective和gluOrtho2D。3.3.1 透视投影透视投影的特点就是,物体离照相机越远,它在最终图像中看上去就越小。即所谓的近原创 2015-03-16 20:38:09 · 876 阅读 · 0 评论 -
2.1 绘图工具箱
绘图工具箱。在这个工具箱中,有用来绘图的工具。正常画家的工具箱中会有画笔,画刷,铅笔,橡皮等。在OpenGL绘图工具箱中,有清除窗口的工具,指定绘图颜色的工具,强制完成绘图的工具,描述坐标系统的工具。而这些工具,其实就是一些函数。清除窗口如果把窗口比喻成一块黑板,那么清除窗口,就是擦黑板。但是不同的是,这个清除窗口,可以把窗口清除为某种特定背景色,比如绿色。要以指定的颜色清除窗口,先要来了解颜色在O原创 2015-03-05 21:25:34 · 560 阅读 · 0 评论 -
4.2 计算机颜色
颜色的显示显示器通过在每个像素上,发射不同数量的红、绿和蓝光,从而形成颜色。颜色的存储颜色的存储,可以按照两种模型进行,RGBA模式和颜色索引模式。在RGBA模式下,每个像素分别保存一个R,G,B值,并可能保存一个A值。在颜色索引模式下,每个像素存储一个表示颜色序号的数值(称为颜色索引)。每个颜色索引表示颜色表中一个特定的项。颜色表定义了一组特定的R,G,B值,称为颜色映射表。颜色缓冲区用于存储所有原创 2015-03-26 19:46:20 · 471 阅读 · 0 评论 -
3.4 视口变换
视口变换,相当于选择照片大小。视口是一个矩形的窗口区域,图像就是在这个区域中绘制的。3.4.1 定义视口定义视口,使用函数glViewport。这个函数之前用过好多遍了。void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);在窗口中定义一个像素矩形,最终的图像将映射到这个矩形中。(x, y)参数指定了视口的左下角,width原创 2015-03-16 21:41:04 · 1113 阅读 · 0 评论 -
4.1 颜色感知
进入第4章的学习。这一章,主要讲颜色,内容比较少。OpenGL中的颜色模式分为两种,RGBA模式和颜色索引模式。RGBA模式,是指将颜色分成4种成分,RGBA,分别为red, green, blue, alpha,通过这四种成分的强度,然后进行混合,就得到了各种各样的颜色。颜色索引模式,是指事先配置好颜色,当需要使用该颜色时,通过索引去访问该颜色。有点类似于调色板,在各个方格中,配置好颜色,要访问某原创 2015-03-26 19:17:31 · 713 阅读 · 0 评论 -
1.1 什么是OpenGL
OpenGL是图形硬件的一种软件接口。这是书中的定义。先来看OpenGL,这是我们要学的这个东西的名称。图形硬件,通常指显卡,显示器的信号连接线就是从显卡接出来的。软件接口,这个不好理解。先看接口,接口就是一个物体与外界进行交互的部分。一个东西如果没有接口,那么它就不能与外界交互,不能访问外界,也不能被外界访问。再来看硬件接口,常见的鼠标USB接口,属于硬件接口,这个USB接口是的原创 2015-02-01 15:03:02 · 1516 阅读 · 0 评论