基本概念

透视(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): 指所有缓冲区一起串联工作,保存了图形硬件为控制屏幕上所有像素颜色和强度需要的全部信息

OpenGL基础知识的更多相关文章

  1. OpenGL ES 3.0 帧缓冲区对象基础知识

    最近在帧缓冲区对象这里卡了一下,不过前面已经了解了相关的OpenGL ES的知识,现在再去了解就感觉轻松多了.现在就进行总结. 基础知识 我们知道,在应用程序调用任何的OpenGL ES命令之前,需要 ...

  2. Html5 Canvas核心技术(图形,动画,游戏开发)--基础知识

    基础知识 canvas 元素可以说是HTML5元素中最强大的一个,他真正的能力是通过canvas的context对象表现出来的.该环境对象可以从canvas元素身上获得. <body> & ...

  3. OpenGL基础图形编程

    一.OpenGL与3D图形世界1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个充 ...

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

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

  5. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

  6. 【转】OpenGL基础图形编程(一)

    原文:http://blog.chinaunix.net/uid-20638550-id-1909183.html  分类: 一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 ...

  7. android图形基础知识

    Android核心分析(23)-----Andoird GDI之基本原理及其总体框架 2010-06-13 22:49 18223人阅读 评论(18) 收藏 举报 AndroidGDI基本框架 在An ...

  8. openGl 基础

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

  9. three.js学习笔记--基础知识

    基础知识 从去年开始就在计划中的three.js终于开始了 历史介绍 (摘自ijunfan1994的转载,感谢作者) OpenGL大概许多人都有所耳闻,它是最常用的跨平台图形库. WebGL是基于Op ...

随机推荐

  1. Alt.js的入门

    一.什么是Alt altJS是基于Flux使用Javascript应用来管理数据的类库,它简化了flux的store.actions.dispatcher. 关于Flux,以下链接都做了很好的诠释 h ...

  2. 【BZOJ】【3991】【SDOI2015】寻宝游戏

    dfs序 我哭啊……这题在考试的时候(我不是山东的,CH大法吼)没想出来……只写了50分的暴力QAQ 而且苦逼的写的比正解还长……我骗点分容易吗QAQ 骗分做法: 1.$n,m\leq 1000$: ...

  3. 升级到win8.1后除IE11外,其它浏览器无法打开网页解决办法

    原文 : http://productforums.google.com/forum/#!topic/chrome/TUDjVQzf4Os 用管理员方式打开cmd 输入 netsh winsock r ...

  4. fpu栈溢出

    老大们遇到个问题,有一堆浮点数运算,分开写就对,合一起就溢出. 是因为定义的函数返回float的时候,别的地方声明是void错了,这样的错误累计八次之后,浮点数寄存器就满了.没地方放就错了. 函数前面 ...

  5. VS Bug 当获取其他项目的代码时, F5 无法进入调试模式. 也不报错....

    在64位的机子下, 被获用的项目使用X86时会出现. 就会出现   F5 无法进入调试模式. 也不报错.... 打断点也没有用. 在不加入X86项目的代码时, 又可以运行..   解决方案:   检查 ...

  6. svg琐碎01

    svg中的<g>主要用来做分组的定位,使用transform="translate(xOffset,yOffset)" 更改起始坐标. transform中的坐标是相对 ...

  7. Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service

    准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ...

  8. delphi一些小技巧 从别处看到

    开发环境--------    Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件.安装好Delphi ...

  9. HDU4916 Count on the path(树dp??)

    这道题的题意其实有点略晦涩,定义f(a,b)为 minimum of vertices not on the path between vertices a and b. 其实它加一个minimum ...

  10. kafka配置

    官网:http://kafka.apache.org/ 主要有3种安装方式: 1. 单机单broker 2. 单机多broker 3. 多机多broker 1. wget http://mirror. ...