OpenGL超级宝典笔记8

来源:互联网 发布:python源码剖析笔记 编辑:程序博客网 时间:2024/06/11 18:59


第十四章 深度纹理和阴影

阴影贴图是一种实用的技巧,可以实现逼真的光照效果,而不需要大量的额外处理。光源的视点可以用于确定哪些物体被照射以及哪些物体被阴影所遮掩。深度纹理是一种特殊的纹理,它存储深度缓冲区的内容,把它作为阴影贴图使用。

a) 一种新类型的纹理 我们需要把深度值从深度缓冲区复制到一个纹理中,作为阴影贴图使用。OpenGL允许通过glCopyTexImage2D函数直接把颜色值复制到纹理中。

b) 首先绘制阴影,模拟一些环境光,然后就是光照。 我们需要以纹理坐标为结束,它将索引到光源的裁剪空间的阴影贴图中。首先把视觉线性纹理坐标投影到照相机的视觉空间。因此要回溯到场景空间,然后再变换到光源的视觉空间并最终变换到光源的裁剪空间。矩阵乘法表示为M=P_light*MV_light*MV_camera-1 。设置一个纹理矩阵,负责实现必要的纹理坐标操作。然后,将使用与视觉线性纹理坐标生成相关联的平面方程式,使纹理矩阵发挥作用。

c) 阴影比较 最后把深度测试设置为“小于等于”,这样我们就可以在微弱的基础上进行光照下的绘图。否则,由于几何图形是相同的,光照将无法通过深度测试,这样在弱光阴影之后就不会显示任何东西,接着将生成纹理把它绑定到阴影贴图中,把纹理坐标环境模式设置为截取到边缘纹理单元。

 

第十五章 可编程管线:这已不是旧式的OpenGL

学习OpenGL着色语言GLSL的基础知识,讨论所有的变量类型、操作符以及操控流机制。还描述如何使用命令加载和编译着色器对象,以及链接和使用程序对象。

a) 新的占主导,着色器 它的实质是应用程序所定义的自定义程序,用于接替固定功能管线阶段的职责。可编程顶点着色器,能够替代顶点变换、光照、纹理坐标处理。固定功能胶水:在顶点着色器和片段着色器之间,仍然保留了一些固定功能阶段,它们将作为粘贴两种着色器的胶水。可编程片段着色器能够替代纹理、颜色求和、替代雾。

b) 管理高层着色器 GLSL使用两种类型的对象:着色器对象和程序对象。着色器对象加载着色器文本并对它进行编译。调用glGreateShader函数创建着色器,而glDeleteShader函数是删除着色器。着色器对象的目标是简单地接受着色器文本并对它进行编译,当着色器文本被加载到一个着色器对象之后,需要对它进行编译。编译过程就是解析着色器并确保其中不存在错误。

c) 第二种类型对象是程序对象 这种对象作为着色器对象的容器使用,把它们链接到一个可执行文件。关于程序对象操作的函数有:创建和删除、粘附和分离、链接程序、验证程序和使用程序。

d) 变量和函数必须预先进行声明。变量包括:基本类型、结构、数组、限定符、内置的变量。表达式包括:操作符、数组访问、构造函数、成分选择。控制流包括:循环、if/elsediscard、函数。

 

第十六章 顶点着色,自行转换、光照和Texgen

讲述顶点着色器能够让读者对它有一个清晰的认识。在现实应用中,顶点着色器常常只扮演与它们对应的片段着色器的支持角色,执行一些诸如准备纹理坐标之类的辅助任务。

a) 散射光照 需要考虑表面相对于入射光线的方向,方程式如下:C_diff = max{N*L,0} x C_mat x C_li // N是这个顶点的单位法线,L是表示从顶点到光源的单位向量的方向。C_mat是表面材料的颜色,C_li是光线的颜色,C_diff是最终的散射颜色。

b) 镜面光照 需要考虑表面相对于入射光线的方向,方程式如下:C_spec = max{n*h,0}^Sexp x C_mat x C_li //H是代表光线向量和视图向量之间夹角正中的方向,称为半角向量。Sexp是镜面指数,用于控制镜面光照的紧密程度。C_spec是最终产生的镜面颜色。

c) 基于顶点的雾 尽管雾是基于片段的光栅化阶段才指定的,出现在纹理阶段之后。但是,在OpenGL实现常常把绝大多数必要的计算提前到顶点阶段,然后把结果插值到图元中。这样可以大大的提高性能,对图像精确度的损失几乎可以忽略不计。

d) 基于顶点的点大小 对于远离观察点的物体,应用雾效果后,颜色也会变淡。类似地,靠近观察点的物体的点大小要大于距观察点较远的点大小。和雾一样,点缩减也是一种非常实用的传递透视信息的视觉线索,它所需要的计算也非常类似。

原创粉丝点击