OpenGL图形编程(一)

概要:
1、图形和渲染简介
2、shader和GLSL
3、OpenGL简介

我们在屏幕上看见的所有东西,都可以简单的看成是以二维数组格式存储的像素(pixels)。

上图中,每一个方块是一个像素(pixel),注:pixel一词来源于“Picture Element”。我们把pixels组成的二维数组叫做image。
既然我们看到的图形只是二维pixels数组,那怎么表现出3D世界?3D图形学就是通过一系列的转换计算改变这些像素的颜色,让我们以为在屏幕上看到的是3D的世界,这个过程叫做渲染(rendering)。通过显卡做这些3D转换的过程,叫做光栅化(rasterization)。在光栅化过程中,所有物体都被看成是一个空壳,所有的空壳都是由不共线的三角形组成(因为三角形的三个顶点一定是共面的);如果离得很近去看,每一个看似圆形的面,都是由许多小的三角形组成的。组成一个物体的一系列三角形通常被叫做 模型(model)或 网格(mesh)。

光栅化有好几个阶段,这些阶段是在一个被叫做管线(pipeline)的东西里进行的:在管线上面放进去三角形数据,然后从下面出来2D的图形。这些三角形是以放入的顺序,一个一个画出来的。

OpenGL是一种访问光栅化过程的API。

光栅化过程总览:
1、裁剪空间转换(Clip Space Transformation)
光栅化的第一步,就是把所有的顶点转换到一个特殊的有限区域的空间里,在这个空间里的物体会被渲染,空间之外的则不会被渲染。这块空间,在OpenGL里,叫做裁剪空间(Clip Space),区域外的三角形会被抛弃,有一半在区域内的三角形会被“裁剪”成多个包含在空间内部的小三角形;空间里的三角形每个顶点的位置,我们称之为裁剪坐标(clip coordinates)。
裁剪坐标和常规的三维坐标有一点点不同的是,它有4个坐标:除了XYZ坐标,还有一个W坐标,这个坐标通常代表裁剪空间相对于这个点的坐标的长度(听起来有些别扭,其实不难理解,我们往后看)。
一个三角形的每个顶点对应的裁剪空间有可能是不同的,这个区域在XYZ方向的范围都是[-W,W],所以,具有不同W坐标的点,他们是村存在于不同的裁剪空间的。
在裁剪空间里,+X指向右,+Y指向上,而+Z指向远方。
2、标准坐标系(Normalized Coordinates)
裁剪空间因为有不用的W长度,所以计算起来很不方便。所以,我们要把裁剪坐标转换到一个更合理的坐标系 标准设备坐标系(normalized device coordinates);这个转换很简单,就是把每个顶点的XYZ除以W。其实,标准设备坐标系,就是裁剪坐标系,只是XYZ的范围都变成了标准的[-1,1]。

3、窗口转换(Window Transformation)
光栅化的下个过程,还是要对顶点做一些转换,从标准坐标系转换到和OpenGL正在运行的窗口有关的窗口坐标系。
这里,虽然和窗口有关了,但这些点,还都保留着3D的坐标:X向右,Y向上,Z向远方。窗口坐标系和裁剪坐标系唯一区别是,边界不同了:窗口坐标系的Z [0,1],在这之外的点不能显示出来;X和Y取决于当前运行OpenGL窗口的大小,XY坐标系的原点在左下角。
4、光点转换(Scan Conversion)
这个过程根据三角形盖住窗口上像素的程度,把三角形以像素的形式显示出来。这个过程只用到了X和Y坐标,Z坐标的作用,我们后面会提到。

三角形经过光点转换之后得到的结果,是一系列覆盖这个三角形形状的片段(fragments),每个片段都有与之相关的窗口坐标系XY和Z坐标。
5、片段处理(Fragment Processing)
这个阶段,会把上阶段的片段转换成一个或多个颜色值 和 一个深度值,单个三角形产生的所有片段处理顺序是无序的,或者说是互不相干的(这里应该是并行处理的)。但是,因为不同三角形之间可能会有遮盖,所以,来自不同三角形的片段,不能同时处理,一个三角形的所有片段处理完之后,才能处理下一个三角形片段。这个阶段我们通过OpenGL API可以参与很大一部分过程,具体的细节后面再详解。
6、片段写入(Fragment Writing)
这个阶段,带有颜色和深度的片段会经过很多的计算,然后写入image。
到这里光栅化过程就结束了。


shader是用来在渲染操作某个阶段运行的一段程序。
GLSL(OpenGL Shading Language)是OpenGL的主要shader语言。语法很像C,但是和C语言也有很多不同。


OpenGL可以 理解成一套 API(其实严格的说,是一套标准,或文档),有很多种语言的实现,但底层实现都依赖于C API。
OpenGL被设计成一个 状态机,几乎所有的function都是改变或返回某个特定状态。唯一例外是那些直接引起渲染的方法。
关于OpenGL版本:OpenGL有很多个version的规范,但大多数情况下最新的API都能向下兼容旧的API,唯一的例外是3.0版本,这个版本把很多旧版本的function 标记成了 deprecated (不推荐使用的),并且在3.1版本里,删除了这些function。这样,就产生了2个规范,核心规范和通用规范(保留了3.1删除的functions),但是我们不用担心,没有哪个OpenGL驱动开发者会只实现驱动的核心规范,所以,可以认为,所有opengl版本都是向下兼容的。
这个系列的OpenGL文章,要求硬件最低需要支持OpenGL version 3.3。需要GeForce 8xxx 以上显卡,或者 Radeon HD 系列显卡。这些卡也是支持“Direct3D 10”的卡。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
  总目录   第一章 OpenGL与三维图形世界     1.1 OpenGL使人们进入三维图形世界     1.2 OpenGL提供直观的三维图形开发环境     1.3 OpenGL称为目前三维图形开发标准   第二章 OpenGL概念建立     2.1 OpenGL基本理解     2.2 OpenGL工作流程     2.3 OpenGL图形操作步骤   第三章 Windows NT环境下的OpenGL     3.1 Windows NT下的OpenGL函数     3.2 OpenGL基本功能     3.3 Windows NT下OpenGL结构   第四章 OpenGL基本程序结构   第五章 OpenGL数据类型和函数名   第六章 OpenGL辅助库的基本使用     6.1 辅助库函数分类     6.2 辅助库应用示例   第七章 OpenGL建模     7.1 描述图元      7.1.1 齐次坐标      7.1.2 点      7.1.3 线      7.1.4 多边形     7.2 绘制图元      7.2.1 定义顶点      7.2.2 构造几何图元   第八章 OpenGL变换     8.1 从三维空间到二维平面      8.1.1 相机模拟      8.1.2 三维图形显示流程      8.1.3 基本变换简单分析     8.2 几何变换      8.2.1 两个矩阵函数解释      8.2.2 平移      8.2.3 旋转      8.2.4 缩放和反射      8.2.5 几何变换举例     8.3 投影变换      8.3.1 正射投影      8.3.2 透视投影     8.4 裁剪变换     8.5 视口变换     8.6 堆栈操作   第九章 OpenGL颜色     9.1 计算机颜色      9.1.1 颜色生成原理      9.1.2 RGB色立体     9.2 颜色模式      9.2.1 RGBA模式      9.2.2 颜色表模式      9.2.3 两种模式应用场合     9.3 颜色应用举例   第十章 OpenGL光照     10.1 真实感图形基本概念     10.2 光照模型      10.2.1 简单光照模型      10.2.2 OpenGL光组成      10.2.3 创建光源      10.2.4 启动光照     10.3 明暗处理     10.4 材质      10.4.1 材质颜色      10.4.2 材质定义      10.4.3 材质RGB值和光源RGB值的关系      10.4.4 材质改变   第十一章 OpenGL位图和图像     11.1 位图      11.1.1 位图和字符      11.1.2 当前光栅位置      11.1.3 位图显示     11.2 图像      11.2.1 象素读写      11.2.2 象素拷贝      11.2.3 图像缩放      11.2.4 图像例程   第十二章 OpenGL纹理     12.1 基本步骤     12.2 纹理定义     12.3 纹理控制      12.3.1 滤波      12.3.2 重复与约简     12.4 映射方式     12.5 纹理坐标       12.5.1 坐标定义       12.5.2 坐标自动产生   第十三章 OpenGL复杂物体建模     13.1 图元扩展      13.1.1 点和线      13.1.2 多边形     13.2 法向计算      13.2.1 法向基本计算方法      13.2.2 法向定义     13.3 曲线生成      13.3.1 曲线绘制举例      13.3.2 曲线定义和启动      13.3.3 曲线坐标计算      13.3.4 定义均匀间隔曲线坐标值     13.4 曲面构造      13.4.1 曲面定义和坐标计算      13.4.2 定义均匀间隔的曲面坐标值      13.4.3 纹理曲面      13.4.4 NURBS曲面   第十四章 OpenGL特殊光处理     14.1 光照模型      14.1.1 全局环境光      14.1.2 近视点与无穷远视点      14.1.3 双面光照     14.2 光源位置与衰减     14.3 聚光与多光源      14.3.1 聚光      14.3.2 多光源与例程     14.4 光源位置与方向的控制     14.5 辐射光   第十五章 OpenGL效果处理     15.1 融合      15.1.1 Alpha值与融合      15.1.2 融合因子      15.1.3 融合实例     15.2 反走样      15.2.1 行为控制函数      15.2.2 点和线的反走样      15.2.3 多边形的反走样     15.3 雾      15.3.1 雾的概论和例程      15.3.2 雾化步骤   第十六章 OpenGL显示列表     16.1 显示列表概论      16.1.1 显示列表的优势      16.1.2 显示列表的适用场合     16.2 创建和执行显示列表      16.2.1 创建显示列表      16.2.2 执行显示列表     16.3 管理显示列表      16.4 多级显示列表   第十七章 OpenGL帧缓存和动画     17.1 帧缓存      17.1.1 帧缓存组成      17.1.2 缓存清除     17.2 动画
实验一 OpenGL+GLUT开发平台搭建 5 小实验1: 开发环境设置 5 小实验2: 控制窗口位置和大小 6 小实验3:默认的可视化范围 6 小实验4:自定义可视化范围 7 小实验5: 几何对象变形的原因 8 小实验6: 视口坐标系及视口定义 8 小实验7:动态调整长宽比例,保证几何对象不变形 9 实验二 动画和交互 10 小实验1: 单缓冲动画技术 10 小实验2: 双缓冲动画技术 11 小实验3:键盘控制 13 小实验4:鼠标控制【试着单击鼠标左键或者右键,试着按下鼠标左键后再移动】 14 实验三 几何变换、观察变换、三维对象 16 小实验1:二维几何变换 16 小实验2:建模观察(MODELVIEW)矩阵堆栈 17 小实验3:正平行投影1 19 小实验4:正平行投影2 19 小实验5:正平行投影3 20 小实验6:透射投影1 21 小实验6:透射投影2 22 小实验7:三维对象 24 实验四 光照模型和纹理映射 26 小实验1:光照模型1----OpenGL简单光照效果的关键步骤。 26 小实验2:光照模型2----光源位置的问题 28 小实验3:光照模型3----光源位置的问题 31 小实验4:光照模型4----光源位置的问题 33 小实验5:光照模型5----光源位置的问题 35 小实验6:光照模型6----光源位置的问题 38 小实验7:光照模型7----光源位置的动态变化 40 小实验8:光照模型8----光源位置的动态变化 43 小实验9:光照模型9---光源位置的动态变化 45 小实验10:光照模型10---聚光灯效果模拟 48 小实验11:光照模型11---多光源效果模拟 50 小实验12:光照效果和雾效果的结合 53 小实验13:纹理映射初步—掌握OpenGL纹理映射的一般步骤 56 小实验13:纹理映射—纹理坐标的自动生成(基于参数的曲面映射) 59 小实验14:纹理映射—纹理坐标的自动生成(基于参考面距离) 61
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值