140 likes | 268 Views
凹凸贴图. Michael I. Gold NVIDIA 公司. 凹凸贴图. 真实的凹凸贴图是逐像素计算的 光照计算是按每个象素点的法向量计算的 巨大的计算量 更多的信息可以看 : Blinn, J. Simulation of Wrinkled Surfaces. Computer Graphics. 12, 3 (August 1978), 286-292. 凹凸贴图. 凹凸贴图是在效果和精度之间的一个折中 只能对漫射光计算,不能使用反射光 欺骗视觉的采样 可能运行于当前的硬件上 如果它看起来很好,就干吧. 漫射光的计算.
E N D
凹凸贴图 Michael I. Gold NVIDIA 公司
凹凸贴图 • 真实的凹凸贴图是逐像素计算的 • 光照计算是按每个象素点的法向量计算的 • 巨大的计算量 • 更多的信息可以看: Blinn, J. Simulation of Wrinkled Surfaces. Computer Graphics. 12, 3 (August 1978), 286-292
凹凸贴图 • 凹凸贴图是在效果和精度之间的一个折中 • 只能对漫射光计算,不能使用反射光 • 欺骗视觉的采样 • 可能运行于当前的硬件上 • 如果它看起来很好,就干吧
漫射光的计算 • C = (L•N) Dl Dm • L顶点到灯之间的单位向量 • N顶点的单位法向量 • Dl灯光的漫射光颜色 • Dm顶点材质的漫射属性 • 凸值逐像素改变N值 • 凹凸映射 改变(L*N)的值
近似的漫射因子 L•N • 纹理图代表高度场 • [0,1] 之间的高度代表凹凸方程 • 首先导出偏离度m • m增加/减少基础的漫射因子Fd • (Fd+m) 在每一像素上近似等于 (L•N)
偏移量m的导出 • 偏移量m的近似导出 • 查找(s,t)纹理的高度H0 • 查找(s+s, t+t)纹理的高度H1 • M近似等于H1-H0
计算凹凸量 原始的凸起 (H0) 原始的凸起(H0)向光源移动一小段距离 形成第二个凸起(H1) 亮的图像 暗的图像 用H1凸起减去H0凸起(H1-H0)
计算灯光亮度 • 计算片断的颜色Cf • Cf = (L•N) Dl Dm • (L•N)(Fd + (H1-H0)) • Ct= Dm Dl • Cf =(Fd + (H1-H0)) Ct Fd等于顶点法线与灯光的向量的乘积
上面就是全部么? 太简单了! • 我们还没有完成所有的任务,还必须做以下内容 • 创建一个纹理 • 计算纹理坐标偏移量s, t • 计算漫射因子Fd • s, t,Fd都从N和L导出 • 现在我们开始做一些数学计算
创建纹理 • 保存纹理 • 当前的多重纹理硬件只支持两个纹理 • 偏移值保存在alpha通道里 • 最大凸起值为 = 1.0 • 水平面值为 = 0.5 • 最小值为= 0.0 • 颜色存储在RGB通道中 • 设置内部颜色格式为RGBA8 !!
计算纹理偏移量 • 把灯光方向向量变换到一个笛卡尔坐标系中 • 顶点法线为z轴 • 从法线和视口的“上”向量导出坐标系 • 顶点法线为z轴 • 叉乘得到X轴 • 丢弃“上”向量,利用z,y轴导出x轴 • 创建3x3变换矩阵Mn • 变换灯光方向向量到这个坐标系中
计算纹理偏移量 • 使用法向坐标系中的向量作为偏移量 • L’ = Mn L • 使用L’.x, L’.y 作为 s, t • 使用 L’.z 作为漫射因子! • 如果灯光方向接近垂直,则L’.x, L’.y 非常小 • 如果灯光方向接近水平,则L’.x, L’.y 非常大 • L’.z小于零的含义? • 灯光在法线的对面
在TNT上的实现 • 计算向量,纹理坐标 • 设置漫射因子 • 从纹理单元0取出表面颜色和H0值 • 从纹理单元1取出H1值 • ARB_multitexture 扩展 • 混合纹理扩展 (TBD)
在TNT上的实现 • 混合0 alpha设置: • (1-T0a) + T1a - 0.5 • T1a-T0a 映射到[-1,1],但硬件把它映射到[0,1] • T1a为H1的值,T0a为H0的值 • 0.5 平衡损失的掐除值 • 使用漫射光颜色调制(相乘)片断颜色T0c • 混合1 颜色设置: • (T0c*C0a + T0c*Fda - 0.5) * 2 • 0.5 平衡损失的掐除值 • 乘以2加亮图像颜色