對Embossed Bump Mapping的一點淺見

來源:互聯網
上載者:User
Bump Mapping是在象素層級擾動物體表面法向量的一種光照技術,通過改變光照計算(light calculation)類比物體的"Bumps".Bump mapping最初由Jim Blinn發表的一篇名為"Simulation of Wrinkled Surfaces"的論文.Blinn使用了一種灰階高度圖(grayscale height map)來類比物體表面法向量的擾動.那麼何為bump map?又如何建立bump map呢?Bump map就是包含將應用於3D model上的浮雕資訊(relief information)的一種紋理圖.Relief information有幾種表現形式,之一為elevation或height map,儲存了每個象素的高度變數,通常以grayscale格式儲存;之二為normal map,儲存了紋理圖每個象素的normal vector.此種情況下常把RGB值作為normal vector的3D座標.簡而概之:Bump mapped rendered surface = Base_texture + Bump_mapped texture關於Bump mapping的原理和演算法在nehe lesson22和Emboss Bump Mapping by Michael I. Gold, nVidia Corp. [.ppt, 309K] 已有詳細講解,不再贅述.僅對一些要點及本人學習過程中遇到的一些問題做番解釋.C = (L·N)*Dl*Dm                                        (1)
  • L is light vector
  • N is normal vector
  • Dl is light diffuse color
  • Dm is material diffuse color
(L·N) = (Fd + (H1-H0))                            (2)(H1-H0)即為我們建立的Bump_mapped texture.但是公式2中的(H1-H0)該如何?呢?在nehe教程中是這麼建立的:第一張圖具有原始height map一半的明亮度(H0 = RGB/2);第二張圖具有原始height map反轉圖一半的明亮度(invertH1 = (255-RGB)/2);第一遍繪製時使用H0,第二遍繪製時使用invertH1(切記,需對該紋理座標朝光源方向做微小的位移),同時採用"Additive blending"紋理混合模式(glBlendFunc(GL_ONE, GL_ONE), H = H0 + invertH1 * perturbed).若對invertH1不進行位移,混合後為一(127,127,127)的灰階圖.大家不妨一試 .此二圖混合後,值大於0.5類比了面向光源的表面,小於0.5則對應背向光源.下一要點是計算light vector for each vertex所有的vectors必須在同一座標系下,object or world space.若把成千上萬的片元(fragments)法向量(defined in object space)轉換到world space(light is usually defined in the space),則需要大量的運算,so it is a better choice that transform the light position from world to local space using the inverse transformation matrix.順便介紹一下tangent space.Tangent space一般由一組向量定義局部座標系統(TBN, Normal vector, Tangent vector, Binormal vector),如所示:T平行紋理U方向,B同時垂直於T和N.首先在已知紋理座標U,V的前提下,在object space計算所有vertices的tangent space.結合上面所述,我們就可計算light vector(已從world space轉換到object space)在每個vertex的tangent space中的分量:   反轉圖的位移方向由[LrelX     0     LrelZ]確定,對應紋理座標方向U,V.如果用multiTexture處理H0和invertH1,需硬體支援並對每個紋理單元進行相應的紋理資訊設定(紋理圖象,過濾器,環境,座標及矩陣)對GL_TEXTURE0_ARB指定當前紋理映射功能: glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
 glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_REPLACE); 對GL_TEXTURE1_ARB指定當前紋理映射功能: glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
 glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_ADD);GL_COMBINE_EXT, GL_COMBINE_RGB_EXT, GL_ADD在OpenGL 1.2 Reference Manual有解釋http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.doc/libs/openglrf/glTexEnv.htm在multitexture處理bump mapping中,有幾行代碼一直不解: //disable second texture unit
 glActiveTextureARB(GL_TEXTURE1_ARB);
 glDisable(GL_TEXTURE_2D);
 
 //bind base texture to texture unit 0
 glActiveTextureARB(GL_TEXTURE0_ARB);
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, BASETEXTURE);請大蝦們指點一番了此文是本人學習當中的一些點滴,夾雜些許個人對此技術的理解,不當之處還望指出!切記,切記,不可全信^_^     Embossed Bump Mapping是Bump Mapping中最簡單的一種,缺乏實用性,只能用於diffuse lighting中,但不失為瞭解Bump Mapping的Primer technique.還有三種Bump Mapping技術,有待以後進一步挖掘(前進的動力啊,sigh),現把四種相關技術列表如下:
  • Embossed Bump Mapping
  • Perturbed UV Bump Mapping
  • Perturbed Normals Bump Mapping
  • Dot Product Bump Mapping
 see also:http://developer.nvidia.com/object/GL_Bump.htmlhttp://www.pvrdev.com/pub/PC/doc/f/Bump%20Mapping%20Comparison.htmhttp://nehe.gamedev.net/data/lessons/lesson.asp?lesson=22http://www.pvrdev.com/pub/PC/doc/f/Bump%20Mapping.htm 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.