• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            黎明的剔透里伸出了你沁清的曖昧

            Graphics|EngineDev|GameDev|2D&3D Art

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              60 隨筆 :: 1 文章 :: 18 評論 :: 0 Trackbacks
            environment mapping的技術可以不依賴ray-trace而實現復雜環境我反射,這種技術使用一個或多個紋理來模擬外部環境的反射,這種技術最適合于應用到具有高亮鏡面的物體。
            環境映射方法是從視點到反射物體某點P的一根光纖,根據P點的位置與法向n,計算得到反射光線r,不像光線跟蹤那樣真正去計算反射光線的最近交點,環境映射方法則用該反射光線作為一個索引,得到環境映射中的相應的環境紋理。


            其中計算映射到物體的紋理是通過計算視點到正方體表面點的向量的反向量

            根據http://www.cnblogs.com/sssa2000/archive/2009/03/22/1419205.html中提到的:

            在一個環境中生成球面貼圖的時候,由于環境相對于球體而言無限大,所以可以把球體看成是一個單位球體。同時,有由于相機位于無限遠處,所以相機到球體上的各個點的向量可以看成是相互平行的。

            wps_clip_image1

                 于是很容易的想到:

                 1、生成視線向量V。

                 2、根據頂點法線生成反射向量R。

                 3、查找R和球面的交點。

                 4、根據交點求出UV坐標。

            wps_clip_image2

                 R可以很容易的求出。為了求出UV,需要求出R和球面的交點E在球面的位置。這個時候回到生成球面紋理圖時候的場景,由于球面是單位球面,利用單位球面的一個性質:球面上的點的歸一化法線就是該點在球面上的位置。

                 我們只需要知道在生成球面紋理圖的時候,在球面上相同的點,當反射向量也為R的時候該點的法線為多少即可。

            wps_clip_image3

                 根據向量加法原則,法線是視線向量和反射向量的和。為了模擬視點位于無限遠處的情況,可以假象生成球面紋理圖的過程是位于View Space,這樣的話,Eye Vec就總是(0,0,1)。于是只需要把反射向量也轉化到View Space就可以得出球面的法線向量。

            wps_clip_image4



            也可以這樣理解:


            環境貼圖的坐標和一般2D的貼圖的貼圖坐標不同,首先它需要用三維向量(x,y,z)來定位,GPU以(x,y,z)中絕對值最大的那個軸來決定要采用哪站貼圖,假如坐標為(1,0,0),X軸數值的絕對值最大,所以會采用X軸方向視角的兩貼圖的其中一個,又因為X>0,即正直,所以會用正X軸方向的貼圖。
            選擇好貼圖以后,再把三維貼圖坐標轉換成正常的二維坐標,轉換方法是把絕對值最大的數值除以其他兩個數值,再把得到的結果從-1到1的范圍使用公式f(x)=(x+1.0)*0.5轉換到0~1的范圍,假如貼圖坐標是(2,0,0),那么會使用正x軸方向的貼圖,讀取坐標位置為(0.5,0.5)的像素,
            繪制渲染環境代碼
             1 void draw_environment (){
             2    static GLfloat xPlane[] = 1.0f0.0f0.0f0.0f };
             3    static GLfloat yPlane[] = 0.0f1.0f0.0f0.0f };
             4    static GLfloat zPlane[] = 0.0f0.0f1.0f0.0f };
             5    
             6    glEnable (GL_TEXTURE_GEN_S);
             7    glEnable (GL_TEXTURE_GEN_T);
             8    glEnable (GL_TEXTURE_GEN_R);
             9    
            10    /* Bind to cube map texture */
            11    glEnable (GL_TEXTURE_CUBE_MAP_ARB);
            12    glBindTexture (GL_TEXTURE_CUBE_MAP_ARB, g_uiCubemapTexture);
            13    
            14    //Setup auto texture coord generation 
            15    glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
            16    glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
            17    glTexGeni (GL_R, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
            18    
            19    glTexGenfv (GL_S, GL_OBJECT_PLANE, xPlane);
            20    glTexGenfv (GL_T, GL_OBJECT_PLANE, yPlane);
            21    glTexGenfv (GL_R, GL_OBJECT_PLANE, zPlane);
            22    
            23    glDisable (GL_DEPTH_TEST);
            24    
            25//    glutSolidSphere (20.0f, 60, 30);
            26    glutSolidCube (20.0f);
            27    
            28    glEnable (GL_DEPTH_TEST);
            29    
            30    glDisable (GL_TEXTURE_CUBE_MAP_ARB);
            31    
            32    glDisable (GL_TEXTURE_GEN_S);
            33    glDisable (GL_TEXTURE_GEN_T);
            34    glDisable (GL_TEXTURE_GEN_R);
            35}

            繪制反射場景:

             1void myDispaly(){
             2         GLfloat mat[16], invmat[16];
             3     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);            
             4     glMatrixMode (GL_TEXTURE);
             5     glLoadIdentity ();
             6     glMatrixMode (GL_MODELVIEW);
             7     glLoadIdentity ();
             8     glTranslatef (0.00.0-5.0);
             9    
            10    glRotated (cam_rot.x, 1.0f0.0f0.0f);
            11    glRotated (cam_rot.y, 0.0f1.0f0.0f);
            12    glRotated (cam_rot.z, 0.0f0.0f1.0f);        
            13    draw_environment ();
            14
            15     
            16    glEnable (GL_TEXTURE_GEN_S);
            17    glEnable (GL_TEXTURE_GEN_T);
            18    glEnable (GL_TEXTURE_GEN_R);
            19    
            20    glTexGeni (GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
            21    glTexGeni (GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
            22    glTexGeni (GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
            23    
            24
            25    
            26    glEnable (GL_TEXTURE_CUBE_MAP_ARB);
            27    glBindTexture (GL_TEXTURE_CUBE_MAP_ARB, g_uiCubemapTexture);
            28    
            29    glGetFloatv (GL_MODELVIEW_MATRIX, mat);
            30    compute_matrix_inverse (mat, invmat);
            31    
            32    glMatrixMode (GL_TEXTURE);
            33    invmat[12= 0.0f;
            34    invmat[13= 0.0f;
            35    invmat[14= 0.0f;
            36    invmat[15= 1.0f;
            37    glLoadMatrixf (invmat);
            38    
            39
            40
            41    glMatrixMode (GL_MODELVIEW);
            42    glRotated(45,0,1,0);
            43    glRotated(180,1,0,0);
            44        glutSolidTeapot(1.0);
            45    
            46    
            47    glDisable (GL_TEXTURE_CUBE_MAP_ARB);
            48    
            49    
            50    glDisable (GL_TEXTURE_GEN_S);
            51    glDisable (GL_TEXTURE_GEN_T);
            52    glDisable (GL_TEXTURE_GEN_R);
            53        glutSwapBuffers();
            54}

            渲染結果:



            旋轉場景:



            參考:
            http://www.nvidia.cn/object/cube_chs.html
            http://www.cnblogs.com/sssa2000/archive/2009/03/22/1419205.html

            posted on 2012-02-16 17:51 情絕格調(fresmaster) 閱讀(1422) 評論(0)  編輯 收藏 引用 所屬分類: Graphics
            久久久久国产一区二区| 国产精品久久久久久福利69堂| 久久精品国产一区二区三区不卡| 人妻系列无码专区久久五月天| 国产69精品久久久久久人妻精品| 久久综合九色综合网站| 国产精品久久久天天影视香蕉| 亚洲午夜精品久久久久久浪潮| 国产精品久久99| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 久久久久青草线蕉综合超碰| 色偷偷88888欧美精品久久久| 国产精品久久久亚洲| 亚洲伊人久久成综合人影院| 韩国免费A级毛片久久| 久久人人青草97香蕉| 99久久99久久精品国产片| 久久亚洲私人国产精品vA| 一级a性色生活片久久无 | 久久久WWW成人免费毛片| 久久精品人人做人人爽电影蜜月| 久久婷婷人人澡人人| 久久精品国产99国产电影网 | 久久亚洲AV成人无码国产 | 久久久久久毛片免费看| 四虎国产精品免费久久5151| 香蕉久久夜色精品升级完成| 国产精品成人久久久| 欧美一级久久久久久久大| 久久国产香蕉一区精品| 久久精品国产精品亚洲艾草网美妙| 亚洲欧美精品伊人久久| 69久久夜色精品国产69| 久久国产成人精品麻豆| 国产精品激情综合久久| 93精91精品国产综合久久香蕉| 久久免费精品视频| 久久AⅤ人妻少妇嫩草影院| 久久久精品久久久久久| 思思久久99热免费精品6| 国产一区二区久久久|