1.7 OpenGL
图形学及opengl 开发记录
哲学的天空
这个作者很懒,什么都没留下…
展开
-
openGL学习笔记四十一: PBO
PBO(Pixel Buffer Object): opengl2.0之后才有的,PBO设计的目的就是快速地向显卡传输数据,或者从显卡读取数据,我们可以使用它更加高效的读取屏幕数据。 单个PBO读取屏幕数据效率大概和 glReadPixels() 差不多,双PBO交换读取效率会很高。原因是使用PBO时,屏幕上的数据不是读取到内存,而是从显卡读到PBO中,或者如果内部机制是读取到内存中,但这也是由DMA 控制器来完成的,而不是cpu指令来做的,再加上两个PBO交换使用,所以读取效率很高。 还可以原创 2020-05-14 22:08:38 · 3130 阅读 · 2 评论 -
openGL学习笔记四十:获取屏幕数据并保存为图片
获取当前屏幕、FBO、PBuffer中的数据。相关函数:glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, data); //读取屏幕区域数据 到data数组中代码如下:FrameBufferObject.h 文件#pragma once#include <GL/glew.h>class FrameBufferObject{public: unsigned _width;原创 2020-05-14 18:38:22 · 2767 阅读 · 1 评论 -
openGL学习笔记三十九: FBO
PBuffer: 是opengl的扩展,在opengles 中称作surface,在一个应用程序中建立多个opengl对象,主要用途:离屏渲染(离开屏幕进行渲染),建立一个PBuffer就是建立一个opengl对象,这个opengl对象是在后台绘制,并不把数据绘制到我们的窗口上。Frame Buffer Object(FBO): 帧缓冲对象,另一种离屏渲染方式,比PBuffer更加高效, opengl2.0以上才有的扩展功能。用于缓存一帧数据。 当创建一个fbo对象后,它并不占用显存,它只是一原创 2020-05-14 17:57:45 · 1257 阅读 · 0 评论 -
openGL学习笔记三十八: 绘制加雾特效多纹理逼真地图
从外部Terrain.raw 文件读取高度数据, 法线,添加多纹理支持,形成更真实地图。涉及函数 glEnable(GL_FOG); //开启雾特效 glFogi(GL_FOG_MODE, GL_LINEAR); glFogfv(GL_FOG_COLOR, fogColor); glFogf(GL_FOG_START, 0.0); glFogf(GL_FOG_END, 50.0); glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINA原创 2020-05-10 21:51:39 · 867 阅读 · 3 评论 -
openGL学习笔记三十七:绘制简单地图
地形本质上由一个个顶点(x,y,z)组成多个三角面连接而成。地形有两种来源: 1.美术使用3dmax、maya、bleader工具,画点、线、面,导出三维模型,然后在游戏中加载进来,进行绘制。 2.软件自身使用数据生成,如通过一张高度图生成。涉及函数opengl 绘制网格 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);代码:下面Terrain 类就是生成一个简单的平面地形网格。Terrain.hpp#pragma once#incl原创 2020-05-10 21:40:45 · 3989 阅读 · 1 评论 -
openGL学习笔记三十六:Shader
一、shader: 是一段程序,分为顶点着色、片元着色两种。分别在顶点着色阶段和片元着色阶段使用。二、相关函数: // 1. 创建一个顶点shader对象 vertex = glCreateShader(GL_VERTEX_SHADER); // 给shader vertex对象 指定源代码 glShaderSource(vertex, 1, &vShaderCode, NU...原创 2020-05-03 17:17:05 · 960 阅读 · 0 评论 -
openGL学习笔记三十五:材质
一、材质:二、相关函数: GLfloat mat_yellow[4] = {0.7, 0.6, 0.1, 1}; GLfloat mat_white[4] = {1,1,1, 1}; GLfloat mat_ambient[4] = {0.5,0.5,0.5, 1}; GLfloat mat_black[4] = {0,0,0, 1}; GLfloat mat_red[4] = ...原创 2020-05-03 12:48:49 · 455 阅读 · 0 评论 -
openGL学习笔记三十四:光照、光源
一、 光照:四种光照类型:放射光(自发光) emissive : 没有光照的情况下物体自身会发射光 如:夜明珠环境光 ambient : 即使夜里房间灯全部关掉,还是有微弱光(月光)让你能看见房间物体轮廓,这就是环境光漫反射光镜面反射光 specular :shininess 材质光泽度对比图基本光照模型...原创 2020-05-03 12:34:26 · 1224 阅读 · 0 评论 -
openGL学习笔记三十三: 摄像机优化-矩阵代替
前面说过:opengl 本身没有提供摄像机接口,其实也没有必要提供,因为物体位置时通过投影矩阵、观察矩阵、模型矩阵,运算得到,我们可以通过数学公式计算得到投影矩阵、观察矩阵,然后和模型矩阵相乘。下面我们通过一个例子,不依赖opengl,而是通过数学库得到相应的矩阵和模型矩阵相乘,效果和使用gluPerspective()、gluLookAt() 摄像机一样 。 相关函数://使用glm数学...原创 2020-04-28 16:36:27 · 307 阅读 · 0 评论 -
openGL学习笔记三十二: 摄像机
严格来说 opengl 本身没有提供摄像机接口,而是在glu库中提供了gluLookAt 这个接口,所以摄像机这个概念在三维库opengl中并没有,实际是通过对矩阵的控制来实现摄像机。相关函数: //gluLookAt 函数 本质是通过参数产生一个观察矩阵 然后和 被观察模型矩阵相乘 得到被观察物体位置 // _eye 表示摄像机位置 // _lookAt 表示观察的目标点 // ...原创 2020-04-28 15:44:20 · 342 阅读 · 0 评论 -
openGL学习笔记三十一: 索引缓冲区(IBO)
IBO: 索引缓冲对象,一个立方体就8个顶点,但我们之前绘制时传输6个面,24个顶点,这些顶点很多是重复的,影响传输效率,而且占用内存也较高。 所以引入IBO机制。IBO存储顶点索引,绘制三角形时根据IBO索引去顶点缓冲区对象中取顶点数据进行绘制,从而达到重复利用顶点的目的,减少传输顶点数据,提高opengl运行效率。相关函数: //生成IBO ID _ibo glGenBuffer...原创 2020-04-20 16:34:06 · 1095 阅读 · 0 评论 -
openGL学习笔记三十: 顶点缓冲区(VBO)
VBO: 顶点缓冲区对象,用于存放顶点数据,减少数据从CPU传输到GPU的过程,提升绘制效率,是opengl做顶点优化的一种手段。 opengl绘制时使用大量的顶点数据,每帧传输比较耗时,我们可以通过VBO相关函数分配显存,把顶点数据一次传输到该显存中,让顶点数据驻留在显存中,避免多次传输数据,这个显存中的数据可以全部修改,也可以部分修改,以很低的开销满足绘制要求。相关函数: glGe...原创 2020-04-20 16:09:31 · 876 阅读 · 0 评论 -
openGL学习笔记二十九: 纹理颜色混合
混合: 就是把两种颜色混在一起,具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。 假设我们需要绘制这样一个场景:透过红色的玻璃去看绿色的物体,那么可以先绘制绿色的物体,再绘制红色玻璃。在绘制红色玻璃的时候,利用“混合”功能,把将要绘制上去的红色和原来的绿色进行混合,于是得到一种新的颜色,看上去就好像玻璃是半透明的。要使用OpenGL的混合...原创 2020-04-20 10:51:29 · 674 阅读 · 0 评论 -
openGL学习笔记二十八: 环境纹理
环境纹理: 比如镜子反射周围环境。 glEnable(GL_TEXTURE_GEN_S); //启用纹理环境 x方向 glEnable(GL_TEXTURE_GEN_T); //启用纹理环境 y方向 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); //指定纹理环境的参数 GL_SPHERE_MAP:球形映射 glTexGen...原创 2020-04-20 10:38:06 · 683 阅读 · 0 评论 -
openGL学习笔记二十七: 压缩纹理格式 ETC1,PVRTC,ATITC,S3TC
压缩纹理早期是在d3d中出现的, 后来在opengl 2.0中引入 ,目的是提示绘制性能,常见的纹理格式 -ETC1。基于opengl es 的压缩纹理有常见的如下几种实现:1>. ETC1 (Ericsson texture compression)2>. PVRTC (PowerVR texture compression)3>. ATITC (ATI textu...原创 2020-04-20 10:14:28 · 3550 阅读 · 0 评论 -
openGL学习笔记二十六: 多纹理贴图
多纹理贴图: 即在一个三角形面上贴多张纹理。opengl 中很多地方都需要多纹理,法线贴图至少需要三张纹理,凹凸贴图。//激活纹理单元0 下面操作针对这个纹理单元0glActiveTextureARB(GL_TEXTURE0_ARB);...//启用纹理数组 第0个纹理单元 glClientActiveTextureARB(GL_TEXTURE0_ARB); 代码如下:/...原创 2020-04-20 09:57:00 · 1436 阅读 · 0 评论 -
openGL学习笔记二十五: 纹理循环滚动--纹理矩阵高效实现
纹理循环滚动在cpu上进行计算效率并不高,可以通过纹理矩阵把这个过程搬到GPU中执行。纹理矩阵 : 采用纹理矩阵 改变纹理滚动 缩放 平移效果。,在opengl pc版中有,在opengles 中没有。代码如下://顶点数据struct Vertex { float x, y, z; float u, v;};//纹理IDGLuint _texture;float ...原创 2020-04-20 09:21:03 · 720 阅读 · 0 评论 -
openGL学习笔记二十四: 纹理循环滚动
通过每帧改变纹理UV坐标实现纹理循环滚动。代码如下://顶点数据struct Vertex { float x, y, z; float u, v;};//纹理IDGLuint _texture;float _textureV = 0;;static FIBITMAP*readImage(const char* fileName) { //1 获取图片格式...原创 2020-04-20 09:02:22 · 927 阅读 · 0 评论 -
openGL学习笔记二十三: 更新纹理及局部更新
更新纹理全部: 如果原来纹理ID对应的显存有数据,则删掉,并在显存中重新建立纹理。如果没有,直接建立纹理 void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type,...原创 2020-04-20 08:37:01 · 4300 阅读 · 0 评论 -
openGL学习笔记二十二: MipMap多层级纹理
MipMap多层级纹理: 纹理不仅仅是一张图片数据,可能是一系列图数据,因为图片放大、缩小时纹理要进行插值计算,这个过程是比较耗时间的,为了避免这耗时的计算,提高性能,显卡采用一张图片多层级纹理方式,根据摄像机离纹理距离,采用不同层级的纹理,比如摄像机离纹理较近,选择较大的纹理,摄像机离纹理较远,选择较小的纹理。这就是多层级纹理。代码如下:创建多层级纹理static unsigned c...原创 2020-04-19 17:00:16 · 1874 阅读 · 0 评论 -
openGL学习笔记二十一: 纹理滤波参数用途
纹理滤波: 简单说就是纹理放大、缩小时采用的纹理算法计算纹理颜色值方式 。 使用函数glTexParameteri() 设置纹理参数。代码如下:设置纹理滤波参数static unsigned createTexture(int w, int h, const void* data) { unsigned texId; glGenTextures(1, &texId)...原创 2020-04-19 16:23:10 · 442 阅读 · 0 评论 -
openGL学习笔记二十: 纹理包装GL_TEXTURE_WRAP参数用途
纹理坐标范围是0~1 ,如果设置的值超过1 怎么办?那么就由GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T参数决定怎么做。 使用函数glTexParameteri() 设置纹理参数。代码如下:设置纹理参数static unsigned createTexture(int w, int h, const void* data) { unsigned te...原创 2020-04-19 15:53:08 · 2667 阅读 · 0 评论 -
openGL学习笔记十九: 建立多个纹理并映射到立方体
使用FreeImage加载多个图片,生成多个纹理,并且把这些纹理映射到正方体六个面。代码如下:/** 使用FreeImage 加载多个图片并映射到立方体*/#define GLEW_STATIC#include <stdio.h>#include <stdlib.h>#include <GL/glew.h>#include <GL...原创 2020-04-19 12:31:10 · 597 阅读 · 0 评论 -
openGL学习笔记十八: 立方体纹理映射,使用FreeImage库加载图片
这里使用FreeImage加载图片,生成纹理,并且把这个纹理映射到正方体四个面。FreeImage: 免费的、开源的、跨平台,图像加载处理库,支持20多种图像格式。官网:http://freeimage.sourceforge.net/代码如下:/** 使用FreeImage 加载图片并映射到立方体*/#define GLEW_STATIC#include <std...原创 2020-04-19 12:25:51 · 1334 阅读 · 0 评论 -
openGL学习笔记十七: 简单纹理映射
纹理:就是图片在显存中的的称呼。 纹理坐标(UV坐标):左下角(0,0)、左上角(0,1)、右上角(1,1)、右下角(1,0),任何一张图片做成纹理都是这个坐标。纹理映射:图片贴到一个区域中,区域顶点坐标对应纹理坐标进行贴图。代码实例://顶点数据struct Vertex { float x, y, z; float u, v;};//纹理IDGLuint ...原创 2020-04-19 10:08:42 · 702 阅读 · 0 评论 -
openGL学习笔记十六: 阵变换 平移、旋转、缩放
投影矩阵 模型矩阵 观察矩阵 这三个矩阵奠定了三维体系理论基础。模型矩阵: 指针对绘制模型或者图元进行操作的矩阵,用于对绘制的物体进行位移、旋转、缩放。代码如下:struct Vertex { unsigned char r, g, b, a; float x, y, z;};// 绘制static void render(GLFWwindow * window) {...原创 2020-04-18 18:36:20 · 754 阅读 · 0 评论 -
openGL学习笔记十五: 绘制带颜色的立方体
代码如下:struct Vertex { unsigned char r, g, b, a; float x, y, z;};// 绘制static void render(GLFWwindow * window) { glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);...原创 2020-04-18 17:31:09 · 554 阅读 · 0 评论 -
openGL学习笔记十四: 透视投影
透视投影 三维空间物体显示近大远小。透视投影区域是个棱锥体:透视投影显示效果:opengl透视投影函数: void APIENTRY gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar);代码实例:/** 正交投影*/#define GLEW_STATIC#i...原创 2020-04-18 16:54:47 · 1009 阅读 · 0 评论 -
openGL学习笔记十三: 图片数据直接绘制
直接用颜色数据绘制到屏幕上,这种方法效率较低。代码如下:char* _pixel;//初始化像素颜色static void initPixel() { _pixel = new char[100 * 200 * 4]; for(int i = 0; i < 100 * 200 * 4; ++i) { _pixel[i] = rand() % 255;...原创 2020-04-18 16:21:18 · 664 阅读 · 0 评论 -
openGL学习笔记十二: 绘制贝塞尔曲线及线的反锯齿设置
贝塞尔曲线 贝塞尔曲线 就是一个公式,通过这个公式获取曲线上的点,从而连接成曲线。 二次贝塞尔曲线,有起始点、终点、加上一个控制点,一个控制点控制曲线形状。 三次贝塞尔曲线,有起始点、终点、加上两个控制点,两个控制点控制曲线形状 。代码如下://顶点数据 包含 位置struct Vertex { float x, y, z;};Vertex _line[360...原创 2020-04-18 15:31:25 · 1142 阅读 · 0 评论 -
openGL学习笔记十一: 绘制带颜色的三角形
代码如下://顶点数据 包含 位置 颜色struct Vertex { float x, y, z; float r, g, b;};//opengl 绘制static void render(GLFWwindow * window) { glClearColor(0, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT); //设置三...原创 2020-04-18 13:04:52 · 1134 阅读 · 0 评论 -
openGL学习笔记十: 用三角形方式绘制圆 两种方式:一种低效一种高效
第一种 低效绘制圆 采用 glBegin glEnd 绘制模式,这是opengl 1.0版本中的,在高版本中已经丢弃了。循环中每次调用函数 glVertex3f 一帧调用了1000多次这个函数,CPU开销很大。另外glVertex3f 每次传输一个顶点数据到GPU,效率很低。 所以这种方式绘制效率很低。static void drawCircle() { float cx = 1...原创 2020-04-18 12:35:43 · 2188 阅读 · 0 评论 -
openGL学习笔记九: 绘制三角形
代码实例:/* *简单绘制三角形实例*/#define GLEW_STATIC#include <stdio.h>#include <stdlib.h>#include <GL/glew.h>#include <GLFW/glfw3.h>#pragma comment(linker, "/subsystem:\"windows...原创 2020-04-18 11:28:48 · 340 阅读 · 0 评论 -
openGL学习笔记八: 正交投影
坐标系: 在opengl 里面默认的建立了一个坐标系,即笛卡尔坐标系,X轴向右、Y轴向上、Z轴向外(面向观察者)。![opengl坐标系](https://img-blog.csdnimg.cn/20200418103343271.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM...原创 2020-04-18 11:06:15 · 4226 阅读 · 0 评论 -
openGL学习笔记七: glad库及使用
glad库与glew作用相同,可以看作它的升级版,GLAD的配置与大多数的开源库有些许的不同,GLAD使用了一个在线服务。在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。官方网址为:https://glad.dav1d.de/安装及使用环境:win7 VS20131. 下载glad: 打开GLAD的在线服务,将语言(Langua...原创 2020-04-17 16:10:33 · 15515 阅读 · 1 评论 -
openGL学习笔记六: glew库及使用
window默认支持到OpenGL1.3,后续也没有更新,opengl并不是以API更新或者新的开发包方式更新功能,它使用了扩展方式获取高版本新的功能。如执行扩展功能函数glArrayElementEXT:代码如下 char* ext = (char*)glGetString(GL_EXTENSIONS); //获取该电脑显卡支持的扩展函数结合 PFNGLAR...原创 2020-04-17 15:28:43 · 5459 阅读 · 0 评论 -
openGL学习笔记五: glfw库及使用
glfw(Graphics Library Framework):是继glut,freeglut之后,当前最新的用来创建OpenGL上下文,以及操作窗口的第三方库。是Freeglut升级版,作用基本一样。官方网址为:http://www.glfw.org/安装及使用环境:win7 VS20131. 下载glfw:地址:https://github.com/glfw/glfw2. ...原创 2020-04-17 12:28:10 · 1946 阅读 · 0 评论 -
openGL学习笔记四: freeglut库及使用
freeglut是opengl跨平台实用工具库,用于做窗口界面,封装各个平台鼠标键盘事件等等。用于替代早期的glut库(1998年后就不在更新维护)。安装及使用环境:win7 VS20131. 下载freeglut: 地址:https://sourceforge.net/projects/freeglut/2. cmake打开生成VS工程:a. build目录:为VS工程生成...原创 2020-04-17 11:52:24 · 5706 阅读 · 0 评论 -
openGL学习笔记三: glu库及使用
glu库,是对gl的部分封装,似乎对gl的辅助,操作系统自带。VS环境设置: 项目属性----链接器----附加依赖项----添加库文件GlU32.Lib代码:运行结果:...原创 2020-04-17 11:08:33 · 1959 阅读 · 0 评论 -
openGL学习笔记二: MFC 下搭建开发环境(不借助界面库)
在win mfc环境下,不借助任何界面库搭建opengl开发环境。VS环境设置: 项目属性----链接器----附加依赖项----添加库文件OpenGL32.lib新建MFC项目:创建MFC单文档项目 02exampleOpenGLMFC,选择默认设置。(对话框、多文档类似)引入自己封装的opengl初始化类文件GLContext.hpp、GLContext.c...原创 2020-04-17 11:00:38 · 472 阅读 · 0 评论