fbpx
维基百科

凹凸贴图

凹凸贴图(bump mapping),又稱為凸凹纹理映射皺面貼圖,是一项计算机图形学技术,在这项技术中每个待渲染的像素在计算照明之前都要加上一个从高度图中找到的扰动。这样得到的结果表面表现更加丰富、细致,更加接近物体在自然界本身的模样。法线贴图是一项常用的凹凸贴图技术,另外还有许多其它的实现技术,如视差映射等等。

不带凹凸贴图的球体;下图所用的凸凹纹理;这个使用凹凸贴图的球体几何上与上面的球体一模一样,这改变了球体的浓淡效果,使它看起来像一个

具体实现 编辑

BMEM技术 编辑

BMEM技术通过一张叫做高度图(Height map)的灰度图来储存每一点的高度信息然后直接由API处理。[1]

法线贴图法 编辑

 

但事实上游戏编程员却通常并不喜欢使用BMEM技术,因为他执行速度慢,因此他们通常使用DP3技术:直接把高度图(Height map)转换成一张法线图(Normal Map),其图的RGB分别是原高度图该点的法线指向:Nx、Ny、Nz,这张图可由Direct3D的专门函数帮助我们计算。最后在渲染的时候直接将该高度图的每个像素与光源的向量点乘,即可得到表示每一点的明暗系数的图:根据高度图,越突出的地方,法线与光源夹角越小,该点的数值越大。接着将这张图乘到渲染线中即可,这样就使模型在背光的凹处有阴影而在面向光源处更亮的效果,这样的3D模型看起来就像真的凹凸不平一样。这些都可以直接在渲染流水线中由机器完成。

具体可以使用以下简单的语句来实现:

//将光源位置转换成ARGB DWORD Vector2ARGB(D3DXVECTOR3 *v,float height) { DWORD r=(DWORD)(127.0f*v->x+128.0f); DWORD g=(DWORD)(127.0f*v->y+128.0f); DWORD b=(DWORD)(127.0f*v->z+128.0f); DWORD a=(DWORD)(255.0f*height); return((a<<24L)+(r<<16L)+(g<<8L)+b); } //生成法线图 D3DXComputeNormalMap(pNormalMap,pHeightMap,NULL,0,D3D_CHANNEL_RED,1.0f);//pHeightMap为原高度图的指针,pNormalMap为一张空纹理,用于存放法线图 //在渲染程序段中可以这样写: DWORD F=Vector2ARGB(&light,0.0f); //light是单位化的光源向量 pD->SetRenderState(D3DRS_TEXTUREFACTOR,F);//pD是D3D的设备指针,这句将光源法线参数输入 pD->SetTexture(1,TEXTURE);//设置原纹理,如上面的球,如有需要可以贴上纹理样式 pD->SetTexture(0,normalmap);//使用上面生成好的法线图 pD->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);//设置“来源1”为法线图 pD->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DOTPRODUCT3);//将“来源1”(法线图)与“来源2”(光源法线)进行点乘 pD->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TFACTOR);//设置“来源2”为光线的光源法线参数 pD->SetTextureStageState(1,D3DTSS_COLORARG1,D3DTA_TEXTURE);//这步和下面几步将图片的原纹理加上 pD->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_MODULATE); pD->SetTextureStageState(1,D3DTSS_COLORARG2,D3DTA_CURRENT); 

假凹凸贴图 编辑

三维计算机图形程序员有时使用计算量较小的假凹凸贴图模拟凹凸贴图效果。其中一个方法是使用纹素索引变化取代曲面法线变化,这种方法经常用于二维凹凸贴图。在GeForce 2类型的图形加速硬件中就使用了这项技术。

全屏的二维假凹凸贴图,可以很容易地用简单快速的渲染循环实现,在二十世纪九十年代的示范影像是一个非常普通的视觉效果。

与位移映射之间的差别 编辑

位移映射与凹凸贴图之间区别在例图中已经很明显地显现出来了:在凹凸贴图中,只有法线进行了扰动,而几何体本身没有扰动,这样的结果就是人为改变只出现在物体的轮廓上,而球体本身仍然是原来的圆形。即凹凸贴图只是视觉上的改变,就像一个画得很透视的图片;而位移映射却真的将3D物体变得“凹凸不平”。

参见 编辑

参考资料 编辑

  1. ^ Technologies, Unity. Unity - Manual: Heightmap. docs.unity3d.com. [2017-09-25]. (原始内容于2017-09-26) (英语). 

参考文献 编辑

  • Blinn, James F. "皱纹表面模拟", Computer Graphics, Vol. 12 (3), pp. 286-292 SIGGRAPH-ACM (August 1978)

外部链接 编辑

凹凸贴图, bump, mapping, 又稱為凸凹纹理映射, 皺面貼圖, 是一项计算机图形学技术, 在这项技术中每个待渲染的像素在计算照明之前都要加上一个从高度图中找到的扰动, 这样得到的结果表面表现更加丰富, 细致, 更加接近物体在自然界本身的模样, 法线贴图是一项常用的技术, 另外还有许多其它的实现技术, 如视差映射等等, 不带的球体, 下图所用的凸凹纹理, 这个使用的球体几何上与上面的球体一模一样, 这改变了球体的浓淡效果, 使它看起来像一个橙, 目录, 具体实现, bmem技术, 法线贴图法, 与位移映射. 凹凸贴图 bump mapping 又稱為凸凹纹理映射 皺面貼圖 是一项计算机图形学技术 在这项技术中每个待渲染的像素在计算照明之前都要加上一个从高度图中找到的扰动 这样得到的结果表面表现更加丰富 细致 更加接近物体在自然界本身的模样 法线贴图是一项常用的凹凸贴图技术 另外还有许多其它的实现技术 如视差映射等等 不带凹凸贴图的球体 下图所用的凸凹纹理 这个使用凹凸贴图的球体几何上与上面的球体一模一样 这改变了球体的浓淡效果 使它看起来像一个橙 目录 1 具体实现 1 1 BMEM技术 1 2 法线贴图法 2 假凹凸贴图 3 与位移映射之间的差别 4 参见 5 参考资料 5 1 参考文献 6 外部链接具体实现 编辑BMEM技术 编辑 BMEM技术通过一张叫做高度图 Height map 的灰度图来储存每一点的高度信息然后直接由API处理 1 法线贴图法 编辑 nbsp 主条目 法线贴图 但事实上游戏编程员却通常并不喜欢使用BMEM技术 因为他执行速度慢 因此他们通常使用DP3技术 直接把高度图 Height map 转换成一张法线图 Normal Map 其图的RGB分别是原高度图该点的法线指向 Nx Ny Nz 这张图可由Direct3D的专门函数帮助我们计算 最后在渲染的时候直接将该高度图的每个像素与光源的向量点乘 即可得到表示每一点的明暗系数的图 根据高度图 越突出的地方 法线与光源夹角越小 该点的数值越大 接着将这张图乘到渲染线中即可 这样就使模型在背光的凹处有阴影而在面向光源处更亮的效果 这样的3D模型看起来就像真的凹凸不平一样 这些都可以直接在渲染流水线中由机器完成 具体可以使用以下简单的语句来实现 将光源位置转换成ARGB DWORD Vector2ARGB D3DXVECTOR3 v float height DWORD r DWORD 127 0f v gt x 128 0f DWORD g DWORD 127 0f v gt y 128 0f DWORD b DWORD 127 0f v gt z 128 0f DWORD a DWORD 255 0f height return a lt lt 24L r lt lt 16L g lt lt 8L b 生成法线图 D3DXComputeNormalMap pNormalMap pHeightMap NULL 0 D3D CHANNEL RED 1 0f pHeightMap为原高度图的指针 pNormalMap为一张空纹理 用于存放法线图 在渲染程序段中可以这样写 DWORD F Vector2ARGB amp light 0 0f light是单位化的光源向量 pD gt SetRenderState D3DRS TEXTUREFACTOR F pD是D3D的设备指针 这句将光源法线参数输入 pD gt SetTexture 1 TEXTURE 设置原纹理 如上面的球 如有需要可以贴上纹理样式 pD gt SetTexture 0 normalmap 使用上面生成好的法线图 pD gt SetTextureStageState 0 D3DTSS COLORARG1 D3DTA TEXTURE 设置 来源1 为法线图 pD gt SetTextureStageState 0 D3DTSS COLOROP D3DTOP DOTPRODUCT3 将 来源1 法线图 与 来源2 光源法线 进行点乘 pD gt SetTextureStageState 0 D3DTSS COLORARG2 D3DTA TFACTOR 设置 来源2 为光线的光源法线参数 pD gt SetTextureStageState 1 D3DTSS COLORARG1 D3DTA TEXTURE 这步和下面几步将图片的原纹理加上 pD gt SetTextureStageState 1 D3DTSS COLOROP D3DTOP MODULATE pD gt SetTextureStageState 1 D3DTSS COLORARG2 D3DTA CURRENT 假凹凸贴图 编辑三维计算机图形程序员有时使用计算量较小的假凹凸贴图模拟凹凸贴图效果 其中一个方法是使用纹素索引变化取代曲面法线变化 这种方法经常用于二维凹凸贴图 在GeForce 2类型的图形加速硬件中就使用了这项技术 全屏的二维假凹凸贴图 可以很容易地用简单快速的渲染循环实现 在二十世纪九十年代的示范影像是一个非常普通的视觉效果 与位移映射之间的差别 编辑位移映射与凹凸贴图之间区别在例图中已经很明显地显现出来了 在凹凸贴图中 只有法线进行了扰动 而几何体本身没有扰动 这样的结果就是人为改变只出现在物体的轮廓上 而球体本身仍然是原来的圆形 即凹凸贴图只是视觉上的改变 就像一个画得很透视的图片 而位移映射却真的将3D物体变得 凹凸不平 参见 编辑纹理映射 法向映射 视差映射 位移映射 浮雕纹理映射参考资料 编辑 Technologies Unity Unity Manual Heightmap docs unity3d com 2017 09 25 原始内容存档于2017 09 26 英语 参考文献 编辑 Blinn James F 皱纹表面模拟 Computer Graphics Vol 12 3 pp 286 292 SIGGRAPH ACM August 1978 外部链接 编辑http www blacksmith studios dk projects downloads bumpmapping using cg php 页面存档备份 存于互联网档案馆 Bump Mapping tutorial using CG and C 取自 https zh wikipedia org w index php title 凹凸贴图 amp oldid 75643248, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。