Material - Cube Mapping__ext

來源:互聯網
上載者:User

1.傳統的2D紋理映射是將物體表面的某個點和一個2維座標系中某個點對應的一種映射。環境映射(Environment Mapping)是將物體表面的某個點和一個3維空間中的某個向量對應的一種映射
2.Cube Mapping是一種環境映射,其他的環境映射還有Sphere Mapping和Dual Daraboloid Mapping。

Sphere Mapping在OpenGL可以通過指定紋理座標產生模式為GL_SPHERE_MAP來實現,具體的代碼如下:
  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);  
  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,GL_SPHERE_MAP);


Dual Daraboloid Mapping需要以下兩個條件:
         two texture units;   //這個可以通過texture object來實現
或者   two texture passes;  //這個可以通過multitexture來實現
同時還需要指定問題座標產生模式為GL_REFLECTION_MAP,具體代碼如下:
  glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP);  
  glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP);


3.Cube Mapping在OpenGL中是以EXT_texture_cube_map擴充的形式存在的,最早出現在OpenGL 1.3中。
4.Cube Mapping其他的用途包括:Stable Specular Highlights,Skylight Illumination,Dynamic Cube Map Reflections,Fancy Per-Pixel Lighting.在Per-Pixel Lighting中,Cube Mapping主要目的是用來歸一化向量的,下面是具體的步驟


   設一個立方體(Cube)表面上的任意點的座標是(x,y,z),則從立方體原點到此點的向量是V=(x,y,z),將此向量歸一化後,設歸一化後的向量是V'=(x',y',z'),其中-1<=x',y',z'<=1,在用顏色資訊表示這個單位向量的過程中,需要做特殊的處理,將x',y',z'的大小轉化到[0,255]這個範圍內,具體的轉換公式是:
  V''=( V'+(1,1,1) )/2.0*255;
然後用同樣的方法將立方體表面上的每個點賦給一個象素值。這樣實際上就是為任意向量建立了單位向量查詢表,任意方向,任意長度的向量都可以在立方體的表面上對應一個象素值,此象素值的顏色資訊就是此向量對應的單位向量。

下面是我寫的一個完整的Cube Mapping代碼:

 view plain copy to clipboard print ? 
static GLenum faceTarget[6] = {     GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,     GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,     GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,     GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,     GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,     GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT    };    /* Pre-generated cube map images. */   
char *faceFile[6] = { "cm_left.bmp", "cm_right.bmp", "cm_top.bmp", "cm_bottom.bmp",          "cm_back.bmp", "cm_front.bmp" };       
void makeCubemap()    {     glEnable(GL_TEXTURE_CUBE_MAP_EXT);     
forint i=0; i<6; i++ )     {      LoadBMPff(faceFile[i],faceTarget[i]);     }     glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MIN_FILTER, GL_LINEAR);     glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_MAG_FILTER, GL_LINEAR);        glEnable(GL_TEXTURE_GEN_S);     glEnable(GL_TEXTURE_GEN_T);     glEnable(GL_TEXTURE_GEN_R);     glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);     glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);     glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_EXT);     glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);     glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);     glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);    }  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.