Real Time Rendering Course

Real Time Rendering Course
http://cggmwww.csie.nctu.edu.tw/courses/rtr/2007/#CourseSchedule

News, OpenGL

OpenGL讲座稿_5. DirectX与OpenGL

DirectX是用途极为广泛的API,它并不局限于显示领域。目前的 DirectX中包含有Direct Graphics(Direct 3D + Direct Draw)、Direct Input、Direct Play、Direct Sound、Direct Show、Direct Setup、Direct Media Objects等多个组件,它提供了一整套的多媒体接口方案。但由于DirectX版本的更新主要在3D图形技术上,因此DirectX给人一种图形 API的感觉。
微软发布DirectX的初衷是为了弥补Windows系统对图形管理的不利,但第一代DirectX并未成功,因为当时OpenGL支持者众多,而初出茅庐的DirectX 1则显得稚嫩许多。
第二代DirectX在2D图形方面做了改进,加入了一些2D动态效果,采用了Direct3D的技术。3D应用程序接口采用”平滑模拟”和”RGB模拟” 两种模拟方式对3D图形进行加速计算。同时也采用了更加友好的用户设置程序并更正了应用程序接口的许多问题。整个DirectX的设计架构基本确定,它也是如今的DirectX的雏形。
1997年3D概念进入游戏界,DirectX 3推出了。DirectX 3版本是DirectX 2的简单升级版。
微软没有推出DirectX 4版本,直接推出了DirectX 5。DirectX 5对D3D的内容做了彻底修改,并且使游戏开发商们移植到他们的应用程序接口中更容易、更方便。除此之外,许多应用程序接口的细节部分也得到了改进。加入了雾化效果、Alpha混合等3D特效,使3D游戏中的空间感和真实感得以增强,还加入了S3的纹理压缩技术。同时,DirectX 5在其它各组件方面也有加强。
DirectX 6推出时,已被绝大多数厂商认可并成为实际上的主打游戏API。在这一版本的DirectX中,加入了双线性过滤、三线性过滤等优化3D图像质量的技术,游戏中的3D技术逐渐走入成熟阶段。
DirectX 7的推出伴随着产生了一个GPU的概念,同时在DirectX 7加入了硬件几何转换与光源处理(T&L)技术。虽然OpenGL中已有相关技术,但此前从未在民用级硬件中出现。GPU实际上是一组图形函数的集合,而这些函数由硬件实现,主要用于处理3D游戏中物体移动时的坐标转换及光源处理。硬件T&L的出现一定程度上将CPU解放出来。这一方面提高了整个系统的工作效率,另一方面则让显卡在一定程度上摆脱了CPU的束缚。
DirectX 8的出现全面赶超OpenGL。在DirectX 8中,硬件T&L被Vertex Shader和Pixel Shader取代。VS和PS单元的灵活性更大,它使GPU真正成为了可编程的处理器。这意味着程序员可通过它们实现3D场景构建的难度大大降低。VS和 PS在游戏中带来的最大改变就在于水面的效果。
DirectX 8中的Shader单元还是个简单尝试, DirectX 9中的Shader则成为了标准配置。除了版本升级到2.0外,DirectX 9中PS单元的渲染精度已达到浮点精度,传统的硬件T&L单元也被取消。全新的VertexShader(顶点着色引擎)编程将比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的着色指令增加到了1024条。尽管新的PixelShader(象素着色引擎) 还不支持流程控制,但最大指令数增加到了160条。在DirectX9里,顶点着色编程比以前复杂得多,新的VertexShader标准增加了流程控制,更多的常量,每个程序的VertexShader指令增加到了1024条。尽管新的象素着色还不支持流程控制,但最大指令数增加到了160条。 DirectX9真正关键的特性是64位RGBA色彩(每种颜色信道16位整数)和128位浮点精度(每种颜色信道32位浮点数)。颜色精度的巨大增加将带来让人震惊的视觉效果和图像质量。
预计在2005 年推出的DirectX10将完全放弃GPU当中的固定渲染模式,并且支持GPU行为的完全自由化,即GPU不在明确划分像素着色和顶点着色单元,并且支持多种任务,如2D/3D/视频加速等等任务的自由分配。DirectX10将加入Shader4.0技术,并首度实现RayTracing光线追踪,将位移贴图Displacement作为标准之一。
DirectX 与OpenGL相比的优点:OpenGL仅专注于图形(特别是3D图形)的处理,并且有部分图像处理能力。而DirectX则主要针对游戏而设计的,不仅有图形方面的处理,还包含了图像、声音和音乐、输入设备等等。因此从开发游戏的角度来说,DirectX拥有绝对的优势。另一方面,OpenGL由(由多个成员组成的)ARB进行管理和维护,因此功能的增加和版本的升级受到如知识产权(IP)争议等诸多因素的限制。而DirectX是由Microsoft 独立开发和维护的,本身不存在知识产权的争议问题,升级和维护方面也能够得到Microsoft的积极支持,从双方版本的发展历程就可见一斑。
DirectX 与OpenGL相比的缺点:OpenGL由于其”开放性”而能够得到众多软硬件厂商的支持,同时它是跨硬件平台、跨操作系统、跨语言的,通用性非常广。而 DirectX则是”专为Windows下的游戏程序设计”的,在中低端民用平台上具有比较好的优势,但从整个图形处理领域来说,实力则与OpenGL相差很多。
from: http://kwun.blogbus.com/logs/19051218.html

News, OpenGL

OpenGL讲座稿_4. OpenGL2.0

至OpenGL 1.3为止,OpenGL的发展几乎处于停滞不前的状态,主要的进展是OpenGL扩展指令的推出。这些扩展指令是一些绘图功能、视频及绘图的整合工具,组成了一个混乱的扩展指令组,其中许多都是为专用应用程序而设计的,对大多数需要一致性开发平台的ISV(独立软件开发商,Independent Software Vender)来说并不实用。ARB也已经发现为何无法将OpenGL往前推进的几个原因,包括知识产权(IP)争论的潜伏危机。希望参与ARB(委员会的策划)并提供技术、但也同时也想保护各自IP的厂商大感挫折。
在 2001年9月的ARB会议上,3Dlabs展示了他们的OpenGL 2.0版本(在过去,SGI是ARB事实上的领导者、与下一代扩展指令的发起人。由于SGI明智的将其资源投注在公司的重整上,3Dlabs因而逐渐地在会议中扮演起更为主动的角色,并着手通过教育上的努力,为即将于九月份会议上提出的OpenGL 2.0做准备。)。ARB接受了3Dlabs的提议进行OpenGL 2.0架构的开发,他们也描绘出一个清楚的发展路线。由于已经相当明确,因此OpenGL的主要且近期的目标,就在于启动并开发硬件的可编程能力。然而 OpenGL在其它地方也需要进行更新。OpenGL是在1992被开发出来的,当时的硬件较低级、且在内存管理上并不是那么注重。现在该团体被赋予在 OpenGL中加上内存管理,以便支持高级像素处理的责任。此外,OpenGL还需要和DirectX在材质压缩、也就是ARB所谓的像素封装上进行竞争或合作。接着,嵌入式绘图对OpenGL来说也是非常关键的一项需求。
最后,OpenML的开发兼推行商Khronos Group,则希望将OpenML加入OpenGL的共同发展项目中,以开发结合视频功能与高级绘图能力的产品。此外,包含3Dlabs、Sun(升阳)、Intel、 Discreet、Evans、Sutherland、Pinnacle、RealViz与SGI在内的OpenML组织,对嵌入式设备也有意涉足。他们希望藉由建立互连网设备上的多媒体标准,可以在PDA游戏的移植上有所突破,提供真正的绘图、视频和互动能力。
要开发高级OpenGL标准最先要做的一步,就是回头整合与OpenGL 1.3间的兼容性,同时藉由在一些必备功能、如顶点与像素处理及内存管理上,与DirectX共同合作以维持均势。在第一阶段,OpenGL将会向下保留对Open GL 1.3的完整兼容性。为了达成这一目标,OpenGL 2.0将由OpenGL 1.3现有的功能、搭配完全兼容的新功能所组成。这个好处在于它也将开始对在ARB停滞不前时期,数量不断增加、纠缠不清的扩展指令做一彻底精简。此外,硬件可编程能力的实现,将提供一个更好的方法以整合现有的扩展指令。
下一步就是合成一个提供开发者更多精简API的”纯OpenGL 2.0″。这可通过将特定OpenGL功能规范为”旧式”功能,并指导开发商采用更具有弹性的可编程功能、而扬弃固定不变的函数性功能来达成(图略)。
2004 年9月7日发布OpenGL2.0。主版本号的升级代表这一版本支持高级可编程着色器(high-level programmable shaders)。而从各个版本的升级时间来看,也会发现ARB对OpenGL2.0的推进态度是非常积极的(1.3之前为每三年做一次版本升级,之后为每年一次升级)。
可编程能力是OpenGL2.0里的一个关键词,这表示它是设计来供应用程序存取运用的。为使其符合大部分应用程序与用户的标准,绘图可编程能力通过一种被CPU所采用的可编程能力、类似高级程序设计语言的方式加入的。它将提供一个丰富的,独立于硬件的功能集,并专为在OpenGL架构下使用所设计。
- 可编程顶点处理将会是最常被谈论到的功能。它将取代坐标转换、材质应用程序及照明,并且允许进行随机个别顶点运算。
- 可编程片段处理将取代材质存取、材质应用及雾化功能,以及随机个别片段运算这一开发者企盼已久的功能。
- 可编程图像格式将取代固定格式的封装和解封装运算,在自OpenGL传送或接收像素数据时,将允许类型与格式进行任意组合。
个想法是为了藉由提供可编程能力、与丰富且常效性的功能来取代复杂度,以减少对现有及未来扩展指令的需求。
新API的特色包括:
- 阴影语言。一种独立于硬件的OpenGL2.0阴影语言,与OpenGL1.3有紧密的整合。现有的状态机又增加了可编程单元,将可增设 OpenGL1.3固定式的替代功能。新的着色器可自动纪录现有的OpenGL状态(例如进行一个简单的光源转换而无须覆写参数管理)。它以C为架构,加上容易理解的向量和矩阵类型,同时整合了一些Renderman功能。这套语言会虚拟资源管线,因此对大多数的程序设计师来说便不用去考虑资源管理。将来也会有相同形式、供顶点着色与片段着色之用的语言,并加上一些特别内建的功能和数据限定。
- 顶点处理。其功能在于照明、材质和几何图形的弹性。顶点程序取代部分的OpenGL管线如顶点转换、正规转换、正规化和尺寸重设、光照、彩色材质应用程序、色彩强化、材质坐标产生以及材质坐标转换。顶点着色并不取代下列功能:透视投影与视觉坐标对应、柱状及用户剪裁、隐面消除、原始组合、双面照明选择、多重模式处理、多边形平移及多边形模式。
- 片段处理器。其功能为材质存取、插值计算与像素运算弹性。OpenGL2.0增加了片段处理器能力,将取代下列功能:内插值顶点数据运算、像素缩放、材质存取、缩放和偏向、材质应用、色表查找、雾化、旋绕以及OpenGL管线中的色彩矩阵部分。片段着色不取代下列功能:OpenGL的阴影模型、直方图、覆盖度、极值、像素所有权测试、像素封装和解封装、剪裁、点刻、alpha测试、深度测试、模印测试、alpha混色、逻辑运算、抖动及平面屏蔽。
- 封装和解封装运算。封装和解封装运算的目的在于将”应用像素”转换成一致性的像素群数据流。在数据传送到解封装处理器前先运用未封装储存模式。解封装处理器与 应用->OpenGL 的传输有关,而封装处理器则负责 OpenGL->应用的传输这部分,两者都跟复制运算没有关系。绘图子系统内的复制只使用片段处理器。
- 数据移动与内存管理。为了增进性能,数据移动量必需减至最低。视觉处理的主要数据为:顶点数据(色彩、正规、位置、用户定义等)以及图像数据(材质、图像、像素缓冲区)。建立与管理OpenGL对象的机制大体上就是定位、连结与通过相同接口控制对象,并运用顶点数组、图像、材质、着色、显示清单以及像素缓冲区。OpenGL2.0提供更好的内存管理,并提供应用程序对数据移动的控制能力、更好的顶点处理能力、将数据抓进OpenGL的更有效方法以及 OpenGL对象的直接存取。此外,内存管理功能能够消除为增进数据流量而产生的数据备份,从而大幅提升性能。
- 异步OpenGL。加入了异步运算,具有一般化的时间控制能力,提供了更好的并行化和同步化能力。这将有助于增进平行化和运算时机的控制。
- Glsync。一种新的OpenGL数据类型,用于提供统一的同步化机制。
此外增加了许多额外的功能及能力如:
- FlushStream。OpenGL2.0之前的规格在数据暂存上允许过多的自由度。清除功能被滥用且迫使驱动程序对此做最优化。真正的清除功能是用在当应用程序已经下完渲染指令后才做的。暂存的渲染工作应该和应用程序在处理其它事项时并行运行,在到Glsync上等待前,必需要确定暂存起来的命令会被加以处理。FlushStream就用于解决这一问题。
- 异步数据链路。可在数据复制前提供回传功能,并在数据进行连结时允许主机并行处理。执行线程在OpenGL读数据时可以做其它事。这可以避免内存内容在OpenGL存取完成前被修改,不过这在可以安全修改内存内容时需要加以通知。
- 后台命令流。藉由后台命令流功能,另一个命令流可以下达异步连结的指令,给比优先级较低的渲染工作执行。
- 场消隐通知。让OpenGL可以对视频输出和程序代码进行同步化。
from: http://kwun.blogbus.com/logs/19051080.html

News, OpenGL

OpenGL讲座稿_3. 发展历程

1. 1992年7月1日由SGI发布OpenGL 1.0版,同年ARB成立。此后的每一次版本升级都与上一个版本保持完全向下兼容(详见规范文档2.0 Appendix C-I)。
2. 1995年12月OpenGL 1.1面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括提高纹理映射能力,增加一些几何与片断操作,加入顶点数组,提高顶点坐标、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度等等。
a) 顶点数组(Vertex Array):将顶点信息表示成数组的形式传递给GL,以降低传输非显示列表数据过程中的子调用次数,提升传输效率(例如,充分利用DMA的硬件特性)。
b) 多边形偏移(Polygon Offset):可将经过栅格化的多边形片断的深度值进行偏移操作。
c) 逻辑操作(Logical Operation):通过逻辑操作将由RGBA方式表示的片断融合(merged)至帧缓存中。
d) 纹理图像格式(Texture Image Formats):使用内部格式(internal format)表示存储的纹理信息。
e) 纹理替换环境(Texture Replace Environment):1.1版本的OpenGL中可以显式地使用纹理色彩替换片断色彩,在1.0版本中这种替换(贴图)只能隐式进行。
f) 纹理代理(Texture Proxies):纹理代理允许具体的GL实现声明适用于本实现的最大纹理尺寸(而不是由GL强制定义一个最大纹理尺寸),用户可在运行时间通过代理查询机制得到的纹理参数信息对自定义纹理进行适当处理。
g) 纹理和子纹理的拷贝(Copy Texture and Subtexture):可将帧缓冲区中的数据定义为纹理。
h) 纹理对象(Texture Objects):可将一组纹理(以及每个纹理相应的形状信息state)视为一个对象进行处理。
3. 1998年3月16日发布OpenGL 1.2。1.2版本主要提升了OpenGL的纹理映射能力,以及对象素处理管线进行了增强。从1.2版开始,技术手册中将一部分GL特征定义为可选项,具体的OpenGL实现可以选择是否提供对这些特征的支持。
a) 三维贴图(Three-Dimensional Texturing):OpenGL1.2中可使用三维贴图,同时定义了三维图像在内存中的格式以及象素存储方式。三维贴图的一个重要应用是对成套图像 (volumes of image data)进行渲染。
b) BGRA象素格式(BGRA Pixel Formats):扩展了内存颜色存储格式。用于匹配Windows平台中的文件与帧缓冲区颜色存储格式。
c) 压缩象素格式(Packed Pixel Formats):在内存中压缩象素可使用基本数据类型(unsigned byte/short/integer)进行表示。
d) 法矢量的重缩放(Normal Rescaling):法矢量可以根据模型视图矩阵得到某个常量进行重新缩放。在多数情况下这一操作比重新规格化更加快速,而同时又能确保得到结果就是单位法矢量。
e) 独立镜面光色彩(Separate Specular Color):光照处理过程被更改为:生成包含发射光、环境光与漫射光的主色彩(Primary Color)以及包含镜面光的副色彩(Secondary Color)。主色彩被贴图环境替换,在贴图完成后再添加副色彩得到最终的渲染效果。用于增强其表面色彩由创建光源决定而不是由表面属性决定的物体 (allows highlights whose color is [...]

News, OpenGL

OpenGL讲座稿_2. 功能与特点

OpenGL提供了以下基本操作:
1. 绘制图元:真实世界里的任何物体都可以在计算机中用简单的点、线、多边形来描述。OpenGL提供了丰富的基本图元绘制命令,从而可以方便地绘制物体。
2. 变换:可以说,无论多复杂的图形都是由基本图元组成并经过一系列变换来实现的。OpenGL提供了一系列基本的变换,如取景变换、模型变换、投影变换及视口变换。
3. 光照处理:正如自然界不可缺少光一样,绘制有真实感的三维物体必须做光照处理。
4. 着色:OpenGL提供了两种物体着色模式,一种是RGBA颜色模式,另一种是颜色索引模式。
5. 反走样:在OpenGL绘制图形过程中,由于使用的是位图,所以绘制出的图像的边缘会出现锯齿形状,称为走样。为了消除这种缺陷,OpenGL提供了点、线、多边形的反走样技术。
6. 融合:为了使三维图形更加具有真实感,经常需要处理半透明或透明的物体图像,这就需要用到融合技术。
7. 雾化:正如自然界中存在烟雾一样,OpenGL提供了”fog”的基本操作来达到对场景进行雾化的效果。
8. 位图和图像:在图形绘制过程中,位图和图像是非常重要的一个方面。OpenGL提供了一系列函数来实现位图和图像的操作。
9. 纹理映射:在计算机图形学中,把包含颜色、alpha值、亮度等数据的矩形数组称为纹理。而纹理映射可以理解为将纹理粘贴在所绘制的三维模型表面,以使三维图形显得更生动。
10. 动画:OpenGL提供了双缓存区技术来实现动画绘制。
OpenGL 作为一个性能优越的图形应用程序设计界面(API),适用于广泛的计算机环境。从个人计算机到工作站和超级计算机,OpenGL都能实现高性能的三维图形功能。由于许多在计算机界具有领导地位的计算机公司纷纷采用OpenGL作为三维图形应用程序设计界面,所以OpenGL应用程序具有广泛的移植性。因此,OpenGL已成为目前的三维图形开发标准,是从事三维图形开发工作的技术人员所必须掌握的开发工具。

OpenGL的工作流程图(略 , 参考OpenGL Spec)。GL命令从左边进入。命令分为两种:一种指定需要进行绘制的几何图元对象属性(如顶点坐标值、颜色等),另一种则设定处理这些对象的各个步骤的工作方式(如设定视口、设定光照效果等)。
1. 求值器(Evaluator):通过输入的多项式参数进行计算并逼近曲线/曲面。
2. 顶点操作与图元装配(Per-Vertex Operations, Primitive Assembly):对顶点进行(从世界坐标系到视口坐标系的)几何变换和光照求值、对几何图元进行裁切操作。
3. 栅格化(Rasterization):完成图元信息从视口坐标系到设备坐标系的转换。最后得到一系列片断(Fragment)。
4. 片段操作(Per-Fragment Operations):包括根据片断深度值与深度缓冲区中的深度值进行深度检测并更新深度缓冲区(depth buffer)、融合(blending)操作等等。操作结果最终传送到帧缓冲区(Framebuffer)中。
5. 帧缓冲区(Framebuffer):可以对帧缓冲区进行读取操作,或者将数据进行帧缓冲区之间的移动。
6. 显示列表(Display List):保存(事先设定好的)一系列GL操作,类似于批处理。
7. 象素操作(Pixel Operations):对于如位图(bitmaps)和纹理(textures)等图元进行象素操作之后直接栅格化。
8. 纹理内存(Texture Memory):保存纹理信息,用于贴图操作。
上述流程仅仅是一个是对GL的一个大致描述,而不是严格的流程定义。对于一些对象,例如曲面,则可能在进行多边形化之前先进行了几何变换操作。
OpenGL应用领域十分宽广,如军事、电视广播、CAD/CAM/CAE、娱乐、艺术造型、医疗影像、虚拟世界等。它具有以下特点:
1. 工业标准:OARB(OpenGL Architecture Review Board)联合会领导OpenGL技术规范的发展,OpenGL有广泛的支持,它是业界唯一的真正开放的、跨平台的图形标准。
2. 可靠度高:利用OpenGL技术开发的应用图形软件与硬件无关,只要硬件支持OpenGL API标准就行了,也就是说,OpenGL应用可以运行在支持OpenGL API标准的任何硬件上。
3. 可扩展性:OpenGL是低级的图形API,它具有充分的可扩展性。如今,许多OpenGL开发商在OpenGL核心技术规范的基础上,增强了许多图形绘制功能,从而使OpenGL能紧跟最新硬件发展和计算机图形绘制算法的发展。对于硬件特性的升级可以体现在OpenGL扩展机制以及OpenGL API中,一个成功的OpenGL扩展会被融入在未来的OpenGL版本之中。
4. 可伸缩性:基于OpenGL API的图形应用程序可以运行在许多系统上,包括各种用户电子设备、PC、工作站以及超级计算机。
5. 容易使用:OpenGL的核心图形函数功能强大,带有很多可选参数,这使得源程序显得非常紧凑;OpenGL可以利用已有的其它格式的数据源进行三维物体建模,大大提高了软件开发效率;采用OpenGL技术,开发人员几乎可以不用了解硬件的相关细节,便可以利用OpenGL开发照片质量的图形应用程序。
6. 灵活性:尽管OpenGL有一套独特的图形处理标准,但各平台开发商可以自由地开发适合于各自系统的OpenGL执行实例。在这些实例中,OpenGL功能可由特定的硬件实现,也可用纯软件例程实现,或者以软硬件结合的方式实现。

from: http://kwun.blogbus.com/logs/19050297.html

News, OpenGL

OpenGL讲座稿_1. OpenGL简介

OpenGL (for “Open Graphics Library”) is a software interface to graphics hardware. The interface consists of a set of several hundred procedures and functions that allow a programmer to specify the objects and operations involved in producing high-quality graphical images, specifically color images of three-dimensional objects.

– glspec20.pdf

OpenGL(即开放性图形库Open Graphics Library),是一个三维的计算机图形和模型库。它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。SGI在1992年7月发布1.0版,后成为工业标准,由成立于1992年的OpenGL Architecture Review Board(ARB)负责维护。ARB成员以投票方式产生新的标准,并制成规范文档(Specification)公布,各软硬件厂商据此开发自己系统上的实现。只有通过了ARB规范全部测试的实现才能称为OpenGL。
OpenGL 的官方网站为:http://www.opengl.org
截至2003年10月,ARB投票成员(voting members)包括:
3Dlabs
Apple
ATI
Dell [...]

News, OpenGL

OpenGL中所有受当前ModelViewMatrix影响的参数设定

OpenGL中所有受当前ModelViewMatrix影响的参数设定
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
The position is transformed by the modelview matrix when glLight is called (just as if it were a point), and it is stored in eye coordinates.
如上,传入的光位置参数是定义在模型坐标系下的,但被保存在镜头空间中.且除非再次指定,该值不变,即相当于光的位置相对镜头固定.这通常不是我们想要的, 通常光应该相对世界固定(如DirectX).所以需要在每次变更ModelViewMatrix后再次设置光的位置,以表明其相对世界固定.
glClipPlane:
When you call glClipPlane, equation is transformed by the inverse of the modelview matrix and stored in the resulting eye coordinates. Subsequent changes to the modelview matrix [...]

News, OpenGL

关于normal在eye坐标系下的变化

参考资料:http://www.lighthouse3d.com/opengl/glsl/index.php?normalmatrix 由于需要在视觉空间进行大量的计算, 所以光照需要在视觉空间中进行计算. 因此我们需要求出视觉空间中的法线向量. 转换一个顶点进入视觉坐标的公式如下: vertexEyeSpace = gl_ModelViewMatrix * gl_Vertex; 但是为何我们不能够对法线向量做相同的事情呢? 首先, 法线向量是一个拥有三个元素的一维向量, 模型视图矩阵则是4×4矩阵 这点可以用下面的代码轻易解决: normalEyeSpace = vec3(gl_ModelViewMatrix * vec4(gl_Normal, 0.0)); 所以,gl_NormalMatrix仅仅是上面的剪切代码么? 不, 这不是真的. 上面的代码可以用于一些环境, 但不能作用于所有. 让我们看看下面潜在的问题:

在上图我们看到一个三角形, 有一个法线向量和切线向量. 接下来的图显示当一个观察矩阵缩放的时候所显示的情景.(如调用glScale) 如果我们还是调用上面的代码的话.

注意: 当观察矩阵各方向尺寸不一致时,应当预先保存法线的方向, 虽然法线的长度会变化,但是单元化很易修复 在上图, 观察矩阵影响到所有的顶点以及法线. 很明显这个结果是错误的. 法线并不垂直于切线. 所以现在我们得知并不能将观察矩阵应用于所有的法线. 所以我们应当应用怎样的矩阵呢? 注意到T*N = 0. 所以在视觉空间中, 两者还应当是垂直的, 保证转换后的T’*N’ = 0. 假设矩阵G是转换法线N的矩阵.T则乘观察矩阵左上的3*3矩阵M(T是一个向量, 令w为0).式子如下:

点积可以转换成向量积, 如下

由于N”T = 0, 所以我们猜想
(I为单位矩阵)
所以

因此gl_NormalMatrix等于M的逆矩阵的倒置矩阵 在本文的开始曾说模型观察矩阵作用于法线向量有时候也有效, 这是因为观察矩阵为正交矩阵, 即

正交矩阵 [...]

News, OpenGL

绕任意单位轴旋转任意角度的结果矩阵

绕任意单位轴旋转任意角度的结果矩阵

单位旋转轴:
rx、ry、rz
旋转角:
Φ
opengl的glRotate*函数内部即是计算该矩阵的,不碍比较试试(ps:通过glGetFloat*函数)。显然,绕任意单位轴旋转任意角同样是以旋转向量经过原点为前提的。
另外值得注意的地方是,opengl内部矩阵是按照列序存储的,所以上面的矩阵如果让opengl使用,还要经过一次转置计算。
最后一点,注意角度和弧度的转换
TrackBack: http://blog.chinaunix.net/u2/62895/showart_685396.html

News, OpenGL

呵呵,发现一个好的博客,共享一下

http://www.flipcode.com/archives/articles.shtml

Reflections and Refraction in Raytracing
Bram de Greve
10-14-2004

Creating a Scalable Console System with STL
Facundo Matias Carreiro
10-08-2004

Accelerated Stencil Shadow Extrusion via Vertex Blending
Christian Sch�ler
11-11-2003

Light Mapping – Theory and Implementation
Keshav Channa [...]

News, OpenGL