材質貼圖,又稱紋理貼圖,在計算機圖形學中是把存儲在內存里的位圖包裹到3D渲染物體的表面。紋理貼圖給物體提供了豐富的細節,用簡單的方式模擬出了複雜的外觀。一個圖像(紋理)被貼(映射)到場景中的一個簡單形體上,就像印花貼到一個平面上一樣。這大大減少了在場景中製作形體和紋理的計算量。例如,可以建立一個球並把臉的紋理貼上去,這樣就不用處理鼻子和眼睛的形狀了。

1 = 未加紋理貼圖的3D模型
2 = 加了紋理貼圖的3D模型
多種圖案的例子(點擊圖片放大);
1: 未加紋理貼圖的球體, 2: 紋理貼圖加凹凸貼圖, 3: 僅凹凸貼圖, 4: 透明圖加紋理貼圖

隨着圖形卡功能越來越強,理論上材質貼圖變得越來越不必要,而三維繪製(渲染)成了常用的工具。但事實上,最近的趨勢是使用更大和更多的紋理圖像以及使用把多幅紋理組合到同個物體的不同角度的複雜技術。(這在實時圖形學中更為重要,因為同時顯示的紋理個數是由圖形卡的可用圖形內存容量決定的。)

最後顯示在屏幕上的像素是從紋理的紋素中計算的,計算方法由紋理濾波決定。最簡單的方法是每個像素使用一個最接近的紋素,多個紋素之間的線性插值也很常用,還有更複雜的辦法,參看Mipmap。另外,紋理也可用來決定模型表面的顏色,甚至雙向反射分布函數(BRDF),從而和光照模型等方法結合起來。

例子代碼

編輯

下面是簡單的球面材質貼圖的Java語言實現。

   public double[] sphereMap(double x, double y, double z, int radius)
   {
       /* x,y,z 是球面的法向量乘以它的半径*/
       /* 也就是 vec3 (intersect_pointv3-sphere_centre_pointv3)                */
       double u, v;
       v = Math.acos(z/radius) / PI;
       if (y > 0.0) {
           u = Math.acos(x/(radius * Math.sin(PI * v))) / PI*2;
       }
       else {
           u = (PI + Math.acos(x/(radius * Math.sin(PI * v)))) / PI*2;
       }
       
       return new double[] { u, v };
   }

參看

編輯

外部連結

編輯