基本概念

透视(Perspective)
变换(Transformation)
投影矩阵(Projection Matrix):用于将3D坐标转换为2D屏幕坐标
光栅化(Rasterization): 实际绘制或填充每个顶点之间的像素形成线段
着色器(Shader) 是在图形硬件上执行的单独程序,用来处理顶点和执行光栅化任务
纹理贴图(Texture Mapping)
混合(Blending): 将不同的颜色混在一起
可编程着色器(Programmable Shader)
位平面(bitplane):指一块内存区域,保存了屏幕上每个像素的位信息
平截头体(Frustum):透视投影的视景体,四棱台的形状
片段(Fragment):不是最后的像素数据, 但和像素对应, fragment需要经过处理(blend,texture,lighting...)才会得到最后的像素。

视口(Viewport): 把绘图坐标映射到窗口坐标的区域
图元(Primitives): 一维或二维的实体或表面(点,直线,多边形)
顶点(Vertex): OpenGL顶点是4个分量(x, y, z, w)w为0时代表空间中的点,w为1时代表方向
视景体(View Volume):定义了一个场景如何映射到屏幕上(透视投影还是正投影)其次,视景体定义了哪此部分被剪裁到最终的图像之外。

计算机图形:变换着色纹理混合

矩阵模式:

不同的操作需要切换到不同的矩阵下进行,操作必须和矩阵对应,否则操作无效

下面函数就是用来指定哪一个矩阵是当前矩阵,有三种选择(投影矩阵,模型视图矩阵,纹理矩阵)

void glMatrixMode(GLenum mode);

GL_PROJECTION 要对投影相关进行操作,也就是把物体投影到一个平面上
GL_MODELVIEW 要对模型视景的操作,
GL_TEXTURE      要对纹理相关进行操作

模型视图矩阵是模型矩阵和视图矩阵相乘得到的单一矩阵

注意:设置完glMatrixMode之后必须调用glLoadIdentity,

投影:

OpenGL支持两种投影,透视投影和正投影

正投影(Orthographic Projection):又名平行投影,此时可以指定的视景体是长方体
透视投影(Perspective Projection):会进行透视除法距离观察者远的对象会变小,此时指定的视景体是平截头体

下图左侧是正投影的视景体,右图是透视投影的视景体 即平截头体(Frustum)

首先必须把当前矩阵设为投影矩阵, 才能修改投影方式

glMatrixMode( GL_PROJECTION );
glLoadIdentity();

正投影

void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);

glOrtho就是一个正射投影函数。它创建一个平行视景体。实际上这个函数的操作是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵。
如果绘制的图空间本身就是二维的,可以使gluOrtho2D.

透视投影

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal);

glFrustum函数定义一个平截头体,它计算一个用于实现透视投影的矩阵,并把它与当前的投影矩阵(一般是单位矩阵)相乘。该函数构造了一个视景体用来将模型进行投影,来裁剪模型,决定模型哪些在视景体里面,哪些在视景体的外面,在视景体之外的就不可见。

void glPerspective(GLdouble fov, GLdouble aspect, GLdouble near, GLdouble far)

glPerspective也是用于透视投影,功能和glFrustum非常相似,参数不一样,用的较少。

GLSL

GLSL(OpenGL Shading Language)即OpenGL着色语言
这是一种非常类似于C的程序设计语言。但是,GLSL不会对应用程序流程和逻辑进行控制,而是用于渲染操作。

OpenGL扩展机制:

opengl支持不同硬件厂商扩展API或者枚举
可以动态查询使用的OpenGL支持的扩展,使用GLEW库更简单
代码:

GLint ext_count;
glGetIntegerv(GL_NUM_EXTENSIONS, &ext_count);
// 获得扩展api的字符串名称
glGetStringi(GL_EXTENSIONS, i)


数据类型:

错误处理:

GLeunm glGetError(void);

每次只返回一个值,返回后,保存的错误代码被清除
通常:我们要在循环中调用glGetError()函数,直到返回GL_NO_ERROE为止

获得硬件信息:

可以使用下面函数获得硬件厂商的信息

glGetString(GLenum name)

图形质量还是速度:

void glHint(Glenum target, GLenum mode)

target: 指定要进行修改的行为类型(抗锯齿,纹理压缩质量…),
mode: 指定质量还是速度优先
注意:这是唯一一个行为完全依赖厂商的函数,OpenGL并没有要求函数调用保持一致

OpenGL状态机:

变量的集合成为管线的状态。状态机是一个抽象的模型,表示一组状态变量的集合

设置状态变量

void glEnable(GLenum cap)
void glDisable(GLenum cap)
...

获取状态变量

GLboolean glIsEnabled(GLenum cap);
void glGetBooleanv(GLenum pname, GLboolean *params);
void glGetDoublev (GLenum pname, GLdouble  *params);
void glGetFloatv  (GLenum pname, GLfloat   *params);
void glGetIntegerv(GLenum pname, GLint     *params);

缓冲区:

颜色缓冲区(Color Buffer)
深度缓冲区(Depth Buffer)
模板缓冲区(Stencil buffer)
帧缓冲区(FrameBuffer): 指所有缓冲区一起串联工作,保存了图形硬件为控制屏幕上所有像素颜色和强度需要的全部信息

转载于:https://www.cnblogs.com/luweimy/p/4128279.html

OpenGL基础知识相关推荐

  1. OpenGL基础知识(四)

    今天将继续修改OpenGL基础知识(三)中的例子,并进行了一些简单的动画绘制.在编写代码之前先介绍一下函数glutTimerFunc(unsigned int msecs,void (*func) ( ...

  2. OpenGL基础知识介绍和简单使用

    OpenGL基础知识介绍 OpenGL简介 OpenGL 专业词解析 1.OpenGL上下文[context] 2.渲染 3.顶点数组和顶点缓冲区 4.着色器程序Shader 5.顶点着色器(Vert ...

  3. OpenGL基础知识梳理——Windows上搭建opengles运行环境

    1.概念介绍 1)OpenGLES 官方介绍:https://www.khronos.org/opengles/ OpenGLES(OpenGL for embeded systems)是用于嵌入式设 ...

  4. OpenGL开发之旅基础知识介绍

    最近由于手机项目中需要用到OpenGL ES的知识,所以这段时间正在研究OpenGL的相关知识.因为OpenGL ES是OpenGL的剪裁版本,所以我直接从OpenGL入手,然后再去看OpenGL E ...

  5. Android音视频学习系列(六) — 掌握视频基础知识并使用OpenGL ES 2.0渲染YUV数据

    系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...

  6. OpenGL 和 OpenGL ES基础知识

    当今许多视觉应用程序,从简单的游戏到高级工程领域,都使用OpenGL(Open Graphics Library)和OpenGL ES(OpenGL for Embedded Systems)作为其图 ...

  7. opengl基础学习专题 (二) 点直线和多边形

    题外话 随着学习的增长,越来越觉得自己很水.关于上一篇博文中推荐用一个 学习opengl的 基于VS2015的 simplec框架.存在 一些问题. 1.这个框架基于VS 的Debug 模式下,没有考 ...

  8. 2021-03-15 深入理解SLAM技术【1】 基础知识

    1 啥是SLAM? SLAM是真正的3d技术,是解决移动车辆的定位和动态地图生成的问题的.比如说,你要构造一个自主机器人,能实现路面行走,障碍规避,而且理解三维透视场景,甚至将这种场景翻译成几何场景, ...

  9. python的基础知识可以应用到哪方面-Python基础知识

    python基础 python的诞生 2002年,python 2.x 2008年,python 3.x python的命名 马戏团的名称 python简介 简单.易学 持快速开发. 跨平台. 开源. ...

最新文章

  1. R语言ggplot2可视化配置图例(legend)标签色彩的升序或者反序(reverse)实战:ggplot2可视化默认图例标签色彩(升序,颜色越来越深)、可视化配置图例标签颜色反序(颜色越来越浅)
  2. 编写 DockerFile
  3. [20180808]exists and not exists.txt
  4. AUTOSAR从入门到精通100讲(三十三)-AutoSar架构中的诊断事件管理
  5. Linux系统isosize指令用法
  6. 云图说|分布式事务管理DTM:“买买买”背后的小帮手
  7. 无线传感网1-简单介绍
  8. 基于深度学习、强化学习、开源RASA对话引擎的多场景对话机器人
  9. .NET core ABP 获取远程IP地址
  10. window删除文件夹时提示源路径太长无法删除的解决办法
  11. 三菱plc控制步进电机实例_【干货】plc控制步进电机逻辑思路,思路通了步步顺畅...
  12. 亚马逊云计算机配置,亚马逊云教程6:创建、启动AMI,设置Cloud Watch
  13. pandas数据处理
  14. STM32采用串口DMA方式,发送数据
  15. Linux学习笔记精华总结(选自鸟哥的Linux私房菜)
  16. 一行命令批量修改染色体和位置为RS号
  17. python刷步数程序设计_乐心健康间接修改微信步数-Docker持久运行python脚本
  18. 浅谈“高内聚,低耦合”
  19. neat download manager是什么?多线程下载工具 NeatDownloadManager
  20. Linux系统编程-进程概念、进程管理、信号处理

热门文章

  1. 3 个可以使你的 Python 代码更优雅、可读、直观和易于维护的工具
  2. 正弦信号有效值 c语言,推导正弦波正弦量、平均值、有效值基本公式
  3. netmiko 自动判断设备类型python_Python模块-Netmiko入门
  4. 攻击面管理预防网络攻击原理?
  5. ASP.NET MVC – 样式和布局简介
  6. 渗透测试是否需要学习Linux
  7. 单片机C语言知识用法之,单片机C语言知识用法之define
  8. linux红帽网页中文乱码解决,【linux学习笔记】安装redhat时中文显示乱码(小方框)解决方法...
  9. 关于学习Python的一点学习总结(51)
  10. 关于命令行窗口输入pip list出错的一些解决办法