博文

目前显示的是 五月, 2009的博文

卡通阴影的构造原理--OpenGL笔记

图片
看了两篇关于卡通阴影构造的教程, 觉得有必要写下自己的理解 原理教程: http://www.gamedev.net/reference/programming/features/celshading/ 实例教程: http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=37 其实实例教程是作者写的第二个版本, 以解他人求代码之苦, 呵呵 本文并非翻译, 如有谬误之处, 请指出 卡通阴影主要是指那些漫画手绘绘出的阴影效果, 不用光照实现的虚拟效果. 首先构造一个一维纹理, 其像素值只有白色, 不同程度的灰色, 黑色. 如下图所示 上图为16个像素的一维纹理数据. 然后根据顶点的法线与光线方向的角度设置纹理坐标.其中顶点法线与光线成0度角, 则取纹理坐标1(cos0).如果顶点法线与光线方向垂直,则取纹理坐标0(cos(∏/2)). 本实例的一维纹理有32个像素,如下图所示 用三角形来实现效果, 假设顶点1和顶点3的法线平行于光线方向. 而顶点2的法线则垂直于光线方向. 则效果如下: 代码为: glBegin(GL_TRIANGLES); glTexCoord1f(0.0); glVertex3f(-0.5, -0.5, 0.0); glTexCoord1f(1.0); glVertex3f(0.5, -0.5, 0.0); glTexCoord1f(1.0); glVertex3f(0, 0.5, 0.0); glEnd(); 结论: 如果绘制一个模型, 已知顶点法线向量N, 光线向量L, 顶点坐标V. 则 V*N = |V|*|N|cos(V和N的夹角) (其中*为点积) 所以 V*N / (|V|*|N|) 就等于其纹理坐标向量, 标记为T. 然后 绘制的时候,设置顶点和设置纹理坐标的语句如下: glTexCoord1f(T); glVertex3fv(V); 在使用纹理过程中注意要禁止光照,禁止混合, 允许一维纹理. 在实例教程中, 还涉及了法线向量旋转的问题. 假设原法线向量在单元矩阵中为N, 旋转后的矩阵为 M = {x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x

OpenGL 红宝书 帧缓冲区

图片
第10章 帧缓存 在OpenGL窗口中, 左下角的像素为(0, 0). 一般而言, 像素(x, y)占据的矩形区域左下角为(x, y), 右上角为(x+1, y+1). 10.1 缓存及其用途 1) 颜色缓存, 左前,右前,左后,右后和任意数量的辅助颜色缓存; 2) 深度缓存 3) 模板缓存 4) 累积缓存 注意:X窗口系统,RGBA模式至少保证1个颜色缓冲区,模板缓冲区,深度缓冲区,累计缓冲区 颜色索引模式至少保证1个眼色缓冲区,深度缓冲区,模板缓冲区. 可以使用glXGetConfig{}函数查询. 用glGetIntegerv()查询每个像素占据的缓存空间的参数 GL_RED_BITS, GL_GREEN_BITS, GL_BLUE_BITS, GL_ALPHA_BITS --- 颜色缓存中R, G, B, A分量的位数 GL_INDEX_BITS --- 颜色缓存中每个颜色索引的位数 GL_DEPTH_BITS --- 深度缓存中每个像素的位数 GL_STENCIL_BITS --- 模板缓存中每个像素的位数 GL_ACCUM_RED_BITS, GL_ACCUM_GREEN_BITS, GL_ACCUM_BLUE_BITS, GL_ACCUM_ALPHA_BITS --- 累积缓存中R, G, B, A分量的位数. 10.1.1 颜色缓存 1) 颜色缓存存储了颜色索引或RGB颜色数据, 还可能存储了alpha值. 2) 支持立体观察(stereoscopic viewing)的OpenGL实现有左颜色缓存和右颜色缓存. 它们分别用于左立体图像和右立体图像. 3) 如不支持立体观察, 则只使用左颜色缓存. 4) 双颜色缓存有前缓存和后缓存, 单缓存系统只有前缓存. 5) 支持不可显示的辅助颜色缓存 6) 函数glGetBooleanv()查询是否支持立体观察和双缓存: GL_STEREO和GL_DOUBLE_BUFFER. 函数glGetIntegerv()查询多少个辅助缓存可用: GL_AUX_BUFFERES. 10.1.2 深度缓存 深度缓存 --- 存储了每个像素的深度值. 通常是离视点的距离, 因此深度值大的像素会被深度值小的像素覆盖. 10.1.3 模板缓存 用