• <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>

            小星星的天空

            O(∩_∩)O 小月亮的fans ^_^

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              16 隨筆 :: 0 文章 :: 61 評論 :: 0 Trackbacks

            #


                  實現的方法很簡單。就是用了折射和反射紋理,還用了一張bump圖。

                  首先需要將場景分別渲染到折射紋理和反射紋理。

                  利用gpu程序把這兩張紋理映射到水體上。利用bump圖加上適當的擾動,形成水波效果。

              
                  發下效果圖:
                  

                  

            posted @ 2009-06-04 23:33 Little Star 閱讀(1538) | 評論 (3)編輯 收藏


                  

            首先,我們了解一下BMP的格式,BMP有四部分組成,用表格表示如下:

             

             

             

             

            1. 文件信息頭

            2. 位圖信息頭

            3. 調色板

            4. 位圖數據

             

            第一部分,文件信息頭的格式如下:

            typedef struct tagBITMAPFILEHEADER {

                    WORD    bfType;

                    DWORD   bfSize;

                    WORD    bfReserved1;

                    WORD    bfReserved2;

                    DWORD   bfOffBits;

            } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

            共有14個字節,其中bfType為文件類型,BMP的類型為0×4d42,也就是字母mbbfSize是文件大小,為1234部分大小的總和;bfReserved1bfReserved2123部分大小的總和。

             

            第二部分,位圖信息頭,定義如下:

            typedef struct tagBITMAPINFOHEADER{

                    DWORD      biSize;

                    LONG       biWidth;

                    LONG       biHeight;

                    WORD       biPlanes;

                    WORD       biBitCount;

                    DWORD      biCompression;

                    DWORD      biSizeImage;

                    LONG       biXPelsPerMeter;

                    LONG       biYPelsPerMeter;

                    DWORD      biClrUsed;

                    DWORD      biClrImportant;

            } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

            總共40個字節,字段比較多,可以查看MSDN中的說明,對于RGB24的位圖,這個結構體一般定義如下:

            BITMAPINFOHEADER bih;

                   bih.biSize = sizeof(BITMAPINFOHEADER);

                   bih.biWidth = width;

                   bih.biHeight = height;

                   bih.biPlanes = 1;

                   bih.biBitCount = 24;

                   bih.biCompression = 0;

                   bih.biSizeImage = size;

                   bih.biXPelsPerMeter = 0;

                   bih.biYPelsPerMeter = 0;

                   bih.biClrUsed = 0;

                   bih.biClrImportant = 0;

             

            第三部分是調色板信息,定義如下:

            typedef struct tagRGBQUAD {

                    BYTE    rgbBlue;

                    BYTE    rgbGreen;

                    BYTE    rgbRed;

                    BYTE    rgbReserved;

            } RGBQUAD;

            這部分用來表示RGB各色的強度,一般情況我們不把這一部分寫到文件中。

             

            第四部分就是真正的數據,比如寬度和高度分別是320240,這部分數據的長度應該為320*240*3(每個像素點上有3個字節,分別用來表示b,g,r的顏色)。

             

            根據對BMP格式的說明,我們可以輕易的寫出一個生成BMP圖像的函數,如下所示:


            void saveBmp(const char* name ,int width,int height, unsigned char* data)
            {
             BMPHeader hdr;
             BMPInfoHeader infoHdr;
             int x, y;

             infoHdr.size = 40;
             infoHdr.width = width;
             infoHdr.height = height;
             infoHdr.planes = 1;
             infoHdr.bitsPerPixel = 24;
             infoHdr.compression = 0;
             infoHdr.imageSize =width* height * 3;
             infoHdr.xPelsPerMeter = 0;
             infoHdr.yPelsPerMeter = 0;
             infoHdr.clrUsed = 0;
             infoHdr.clrImportant = 0;

             hdr.type = 0x4D42;
             hdr.reserved1 = 0;
             hdr.reserved2 = 0;
             hdr.offset = 54;
             hdr.size =(DWORD)(sizeof(BMPHeader)+sizeof(BMPInfoHeader)+width* height * 3);


             FILE *fd;

             if( !(fd = fopen(name,"wb+")) )
             {
              printf("***BMP load error: file access denied***\n");
              exit(0);
             }
             fwrite(&hdr,1,sizeof(BMPHeader),fd);
             fwrite(&infoHdr,1,sizeof(BMPInfoHeader),fd);
             fwrite(data,1,width* height * 3,fd);
             fclose(fd);

            }


             從opengl中讀取場景也很簡單,就是個函數就搞定,廢話少說,直接上代碼:

            void
            saveSceneImage()
            {
             GLint pView[4];
             glGetIntegerv(GL_VIEWPORT,pView);

             GLsizei numComponet = 3;
             GLsizei bufferSize = pView[2]*pView[3]*sizeof(GLfloat)*numComponet;
             GLfloat* _data = new GLfloat[bufferSize];
             unsigned char*  data = new unsigned char[bufferSize];
             

             glReadPixels(pView[0],pView[1],pView[2],pView[3],GL_RGB,GL_FLOAT,_data);

             for (int i = 0 ; i <bufferSize ; i ++)
             {
              {
               data[i] = _data[i] * 256;
              }
             }
             saveBmp("1.bmp",pView[2],pView[3],data);
             delete[] data;
             delete[] _data;

            }

             

            有哪位朋友有更好的方法,歡迎討論

            posted @ 2009-06-02 23:54 Little Star 閱讀(3913) | 評論 (1)編輯 收藏



            這周主要是研究了一下shadow map 算法。看起來簡單,實現起來還真不容易。不過做出來以后回頭一看,也沒什么。

            我的方法還比較笨拙,先繪制一遍場景,計算出深度,存儲到一個紋理中。然后第二遍繪制的時候,把點用第一次繪制的時候的矩陣變換一下,讀取出紋理中的值于變換后的z比較。期間遇見了奇怪的矩陣不一致問題,對于opengl中矩陣跟cg的矩陣有什么關系,還是不大清楚,為什么從opengl中讀出的矩陣直接輸入到cg中就不對呢,非要用他內置的變量呢?

            大地形時鋸齒現象還是比較嚴重,雖然采樣了9個點,但是過度還是不那么自然。

                現在模擬出來的現象,比較像點光源。跟透視投影有關吧,那么要是模擬太陽光,是不是就得用正交投影呢?
               
                如果哪位大哥能幫助我解決這些疑問,不勝感激!

               附幾張效果圖,給大家娛樂一下:)

               



            加了消除鋸齒的



            未加消除鋸齒的:)

            下面是隨意截得幾個場景!




            posted @ 2009-05-23 20:10 Little Star 閱讀(1662) | 評論 (2)編輯 收藏

                 摘要:       LOD對于初學者來說可能會感覺到有些復雜,其實做起來很容易。      首先我們談一下為什么要用LOD技術:             &n...  閱讀全文
            posted @ 2009-05-11 11:42 Little Star 閱讀(2739) | 評論 (5)編輯 收藏

            今天加載一個3ds模型,運行時提示說
            Run-Time Check Failure #2 - Stack around the variable 'version' was corrupted.
            明明以前都好用了的,納悶得很。
            仔細查看了下代碼,發現了一處錯誤.
            請看代碼:
             

            //  下面的函數讀出3ds文件的主要部分
            void C3ds::ProcessNextChunk(t3DModel *pModel, tChunk *pPreviousChunk)
            {
             t3DObject newObject = {0};     // 用來添加到對象鏈表
             tMaterialInfo newTexture = {0};    // 用來添加到材質鏈表
             unsigned int version[10] = {0};     // 保存文件版本                          注意:此處以前為unsigned int version10 = 0;  之所以發生那個錯誤,原因是
                                                                                                                                 這里只聲明了一個變量,下面卻那他的地址當讀取文件的目的地址
                                                                                                                                 當讀取字節數超過4時,就會引起上面那個錯誤。 

             int buffer[50000] = {0};     // 用來跳過不需要的數據
             m_CurrentChunk = new tChunk;    // 為新的塊分配空間  

             //  下面每讀一個新塊,都要判斷一下塊的ID,如果該塊是需要的讀入的,則繼續進行
             //  如果是不需要讀入的塊,則略過

             // 繼續讀入子塊,直到達到預定的長度
             while (pPreviousChunk->bytesRead < pPreviousChunk->length)
             {
              // 讀入下一個塊
              ReadChunk(m_CurrentChunk);

              // 判斷塊的ID號
              switch (m_CurrentChunk->ID)
              {
              case VERSION:       // 文件版本號
               
               // 在該塊中有一個無符號短整型數保存了文件的版本
               
               // 讀入文件的版本號,并將字節數添加到bytesRead變量中
               m_CurrentChunk->bytesRead += fread(&version, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);

               // 如果文件版本號大于3,給出一個警告信息
               if (version[0] > 0x03)      // 注意:此處原為version0 > 0x03
                MessageBox(NULL, "This 3DS file is over version 3 so it may load incorrectly", "Warning", MB_OK);
               break;

              case OBJECTINFO:      // 網格版本信息
               
               // 讀入下一個塊
               ReadChunk(m_TempChunk);

               // 獲得網格的版本號
               m_TempChunk->bytesRead += fread(&version, 1, m_TempChunk->length - m_TempChunk->bytesRead, m_FilePointer);

               // 增加讀入的字節數
               m_CurrentChunk->bytesRead += m_TempChunk->bytesRead;

               // 進入下一個塊
               ProcessNextChunk(pModel, m_CurrentChunk);
               break;

              case MATERIAL:       // 材質信息

               // 材質的數目遞增
               pModel->numOfMaterials++;

               // 在紋理鏈表中添加一個空白紋理結構
               pModel->pMaterials.push_back(newTexture);

               // 進入材質裝入函數
               ProcessNextMaterialChunk(pModel, m_CurrentChunk);
               break;

              case OBJECT:       // 對象的名稱
                
               // 該塊是對象信息塊的頭部,保存了對象了名稱

               // 對象數遞增
               pModel->numOfObjects++;
              
               // 添加一個新的tObject節點到對象鏈表中
               pModel->pObject.push_back(newObject);
               
               // 初始化對象和它的所有數據成員
               memset(&(pModel->pObject[pModel->numOfObjects - 1]), 0, sizeof(t3DObject));

               // 獲得并保存對象的名稱,然后增加讀入的字節數
               m_CurrentChunk->bytesRead += GetString(pModel->pObject[pModel->numOfObjects - 1].strName);
               
               // 進入其余的對象信息的讀入
               ProcessNextObjectChunk(pModel, &(pModel->pObject[pModel->numOfObjects - 1]), m_CurrentChunk);
               break;

              case EDITKEYFRAME:

               // 跳過關鍵幀塊的讀入,增加需要讀入的字節數
               m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
               break;

              default:
               
               //  跳過所有忽略的塊的內容的讀入,增加需要讀入的字節數
               m_CurrentChunk->bytesRead += fread(buffer, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
               break;
              }

              // 增加從最后塊讀入的字節數
              pPreviousChunk->bytesRead += m_CurrentChunk->bytesRead;
             }

             // 釋放當前塊的內存空間
             delete m_CurrentChunk;
             m_CurrentChunk = pPreviousChunk;
            }



            我想大家對這段代碼都很熟悉,不知大家是否也遇見過跟我類似的問題,也不知道我說明白了問題沒有,只希望對大家有所幫助O(∩_∩)O  。

            posted @ 2009-05-03 10:46 Little Star 閱讀(6522) | 評論 (7)編輯 收藏



            1. 地形數據直接從bmp文件中讀入的。
            2. 紋理混合用的cg語言,在gpu上實現的。
            3.水面采用的折射,反射和法線貼圖。
            4.第一次發帖,發圖紀念。


                     

            posted @ 2009-04-30 21:05 Little Star 閱讀(2048) | 評論 (3)編輯 收藏

            僅列出標題
            共2頁: 1 2 
            成人a毛片久久免费播放| 久久久久亚洲av无码专区| 国产精品热久久毛片| 久久综合五月丁香久久激情| 亚洲伊人久久大香线蕉综合图片| 久久精品国产亚洲av水果派| 精品人妻伦九区久久AAA片69| 久久亚洲AV成人无码| 日本免费久久久久久久网站| 久久综合偷偷噜噜噜色| 欧美一区二区精品久久| 人妻丰满AV无码久久不卡| 色综合久久综精品| 嫩草伊人久久精品少妇AV| 久久综合五月丁香久久激情| 大伊人青草狠狠久久| 久久受www免费人成_看片中文| 国产婷婷成人久久Av免费高清 | 国产69精品久久久久久人妻精品| 久久国产精品国产自线拍免费| 久久天天躁狠狠躁夜夜不卡 | 久久人人爽人人爽人人片av麻烦 | 久久久久久久久久久精品尤物| 成人午夜精品久久久久久久小说 | 久久久这里有精品| 久久精品国产一区二区| 久久亚洲综合色一区二区三区| 伊人久久久AV老熟妇色| 2020国产成人久久精品| 一级做a爰片久久毛片毛片| 久久se精品一区二区影院| 亚洲国产精品久久久久婷婷软件| 久久66热人妻偷产精品9| 久久国产乱子伦免费精品| 久久久久久久人妻无码中文字幕爆| 久久精品无码一区二区WWW| 亚洲国产成人久久综合区| 2019久久久高清456| 波多野结衣久久精品| 伊人久久大香线蕉综合影院首页| 亚洲国产精品无码久久久蜜芽|