• <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) 閱讀(1416) 評論(0)  編輯 收藏 引用 所屬分類: Graphics
            亚洲精品无码成人片久久| 四虎国产精品免费久久5151| 久久久久无码国产精品不卡| 久久天天躁狠狠躁夜夜av浪潮| 国产精品久久亚洲不卡动漫| 久久久久久久久久久精品尤物| 亚洲精品无码久久久久sm| 久久福利青草精品资源站| 久久国产免费直播| 久久久久国产精品嫩草影院| 国产精品久久国产精麻豆99网站| 久久无码人妻精品一区二区三区| 久久午夜福利无码1000合集| 久久亚洲精品中文字幕| 久久久综合香蕉尹人综合网| 久久精品亚洲精品国产色婷| 国产香蕉久久精品综合网| 99久久婷婷国产综合精品草原| 久久久国产99久久国产一| 国产精品无码久久综合| 人妻精品久久无码专区精东影业| 久久综合丝袜日本网| 久久免费看黄a级毛片| 99久久久久| 国产精品久久毛片完整版| 久久男人Av资源网站无码软件 | 亚洲人成网站999久久久综合| 久久亚洲欧美国产精品| 亚洲欧美成人久久综合中文网 | 欧美成人免费观看久久| 99久久无码一区人妻| 久久免费国产精品一区二区| 久久精品国产亚洲AV无码娇色| 久久婷婷五月综合国产尤物app| 成人国内精品久久久久影院VR | 伊人久久大香线蕉无码麻豆| 99久久精品免费国产大片| 国产亚洲精久久久久久无码AV| 99久久免费只有精品国产| 亚洲欧美日韩精品久久| 国产精品免费久久久久影院|