歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android OpenGL ES->Cube Map

Android OpenGL ES->Cube Map

日期:2017/3/1 10:19:28   编辑:Linux編程

Cube Map,中文可以翻譯成立方環境映射,下面是摘自維基百科的說明:

立方反射映射是用立方映射使得物體看起來如同在反射周圍環境的一項技術。通常,這通常使用戶外渲染中使用的 skybox 完成。盡管由於反射物周圍的物體無法在結果中看到,所以這並不是一個真正的反射,但是通常仍然可以達到所期望的效果。

通過確定觀察物體的向量就可以進行立方映射反射,照相機光線在照相機向量與物體相交的位置按照曲面法線方向進行反射,這樣傳到立方圖(cube map)取得紋素(texel)的反射光線在照相機看來好像位於物體表面,這樣就得到了物體的反射效果。

簡單的講,就是你把一個具有金屬反射特性的茶壺放在一個房間中,茶壺的金屬表面會反射房間的場景,Cube Map就是解決如何將場景(環境)的內容顯示在茶壺的表面,如下圖所示:

本例使用環面(Torus)做為反射的表面,在OpenGL ES中任何3D物體,最終都是通過三角形來構造的,本例代碼generateTorusGrid 和Grid對象用來構造環面的頂點坐標。具體算法有興趣的可以自行研究(需要有立體幾何的知識,這裡不詳細解釋)。

Cube map技術說到底就是用一個虛擬的立方體(cube)包圍住物體,眼睛到物體某處的向量eyevec經過反射(以該處的法線為對稱軸),反射向量reflectvec射到立方體上,就在該立方體上獲得一個紋素了(見下圖)。明顯,我們需要一個類似天空盒般的6張紋理貼在這個虛擬的立方體上。按CUBE MAPPING原意,就是一種enviroment map,因此把周圍場景渲染到這6張紋理裡是“正統”的。也就是每次渲染時,都作一次離線渲染,分別在每個矩形中心放置相機“拍下”場景,用FBO渲染到紋理,然後把這張紋理作為一個cube map對象的六紋理之一。這樣即使是動態之物也能被映射到物體表面了(雖然缺點是不能映射物體自身的任何部分)。

本例使用的六張圖為res/raw 目錄下的 skycubemap0 — skycubemap5 ,如下圖所示

Copyright © Linux教程網 All Rights Reserved