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

            隨感而發

            雜七雜八

            統計

            留言簿(13)

            閱讀排行榜

            評論排行榜

            OpenGL學習筆記【4】——給立方體紋理貼圖(texture)

            今天我學習了對一個正方體貼紋理:
            這次先奉上源代碼:

            #pragma comment(lib, "glaux.lib")
            #include 
            <gl\glaux.h>
            #include 
            <gl\glut.h>

            GLuint g_texture 
            = 0;
            GLfloat xrot 
            =0;
            GLfloat yrot 
            =0;
            GLfloat zrot 
            =0;                                    // Keep Going


            //繪制一個立方體
            int DrawCube(void)
            {
                glBindTexture(GL_TEXTURE_2D, g_texture);        
            //使用貼圖紋理

                glPushMatrix();        
            //壓入變換矩陣

                glRotatef(xrot,
            1.0f,0.0f,0.0f);            //旋轉矩陣,這里繞x軸旋轉。
                glRotatef(yrot,0.0f,1.0f,0.0f);            //旋轉矩陣,這里繞y軸旋轉。
                glRotatef(zrot,0.0f,0.0f,1.0f);            //繞z軸旋轉,這里zrot是角度制的度數。

                glBegin(GL_QUADS);  
            //啟用四邊形帶繪制模式繪制

                
            // 繪制前面,這里開始確定紋理坐標,然后是確定點的位置
                glTexCoord2f(0.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
                glTexCoord2f(
            1.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);
                glTexCoord2f(
            1.0f1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
                glTexCoord2f(
            0.0f1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);

                
            // 繪制后面
                glTexCoord2f(1.0f0.0f); glVertex3f(-1.0f-1.0f-1.0f);
                glTexCoord2f(
            1.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);
                glTexCoord2f(
            0.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);
                glTexCoord2f(
            0.0f0.0f); glVertex3f( 1.0f-1.0f-1.0f);

                
            // 上面
                glTexCoord2f(0.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);
                glTexCoord2f(
            0.0f0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
                glTexCoord2f(
            1.0f0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
                glTexCoord2f(
            1.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);

                
            //底面
                glTexCoord2f(1.0f1.0f); glVertex3f(-1.0f-1.0f-1.0f);
                glTexCoord2f(
            0.0f1.0f); glVertex3f( 1.0f-1.0f-1.0f);
                glTexCoord2f(
            0.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);
                glTexCoord2f(
            1.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
                
                
            // 右面
                glTexCoord2f(1.0f0.0f); glVertex3f( 1.0f-1.0f-1.0f);
                glTexCoord2f(
            1.0f1.0f); glVertex3f( 1.0f,  1.0f-1.0f);
                glTexCoord2f(
            0.0f1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
                glTexCoord2f(
            0.0f0.0f); glVertex3f( 1.0f-1.0f,  1.0f);

                
            // 左面
                glTexCoord2f(0.0f0.0f); glVertex3f(-1.0f-1.0f-1.0f);
                glTexCoord2f(
            1.0f0.0f); glVertex3f(-1.0f-1.0f,  1.0f);
                glTexCoord2f(
            1.0f1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
                glTexCoord2f(
            0.0f1.0f); glVertex3f(-1.0f,  1.0f-1.0f);

                glEnd();

                glPopMatrix(); 
            //彈出變換矩陣

                
            return 1;

            }

            void display(void)
            {
                glClear(GL_COLOR_BUFFER_BIT 
            | GL_DEPTH_BUFFER_BIT);    // 清楚顏色數據和深度數據(清屏)
                glLoadIdentity();                                    // Reset The View
                glTranslatef(0.0f,0.0f,-5.0f);

                DrawCube();

                glutSwapBuffers();            
            //交換緩沖區。顯示圖形
            }


            //載入一個.bmp格式的貼圖紋理
            int LoadGLTextures(GLuint& unTexture, const char* chFileName)                
            {
                AUX_RGBImageRec 
            *TextureImage;                    //保存貼圖數據的指針
                TextureImage = auxDIBImageLoad("Data/NeHe.bmp"); //載入貼圖數據

                glGenTextures(
            1&unTexture);                    // 創建一個紋理,unTexture

                glBindTexture(GL_TEXTURE_2D, unTexture);        
            //綁定紋理,然后對該紋理區添加紋理數據

                
            //設置紋理的信息,
                glTexImage2D(GL_TEXTURE_2D, 03, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);
                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
            //設置濾波為線性濾波
                glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);    //線性濾波

                
            if (TextureImage)                //釋放資源
                {
                    
            if (TextureImage->data)
                    
            {
                        free(TextureImage
            ->data);
                    }

                    free(TextureImage);
                }


                
            return 1;
            }



            //初始化
            void init (void
            {
                glClearColor (
            0.00.00.00.0);            //清理顏色,為黑色,(也可認為是背景顏色)

                glCullFace(GL_BACK);                        
            //背面裁剪(背面不可見)
                glEnable(GL_CULL_FACE);                        //啟用裁剪
                glEnable(GL_TEXTURE_2D);
                LoadGLTextures(g_texture, 
            "Data/NeHe.bmp");            //載入紋理貼圖
            }


            //當窗口大小改變時,會調用這個函數
            void reshape(GLsizei w,GLsizei h)
            {
                
            //這里小說明一下:矩陣模式是不同的,他們各自有一個矩陣。投影相關
                
            //只能用投影矩陣。(只是目前情況下哦,等我學多了可能就知道為什么了。)

                glViewport(
            0,0,w,h);        //設置視口
                glMatrixMode(GL_PROJECTION);    //設置矩陣模式為投影變換矩陣,
                glLoadIdentity();                //變為單位矩陣
                gluPerspective(60, (GLfloat)w / h, 01000);    //設置投影矩陣
                glMatrixMode(GL_MODELVIEW);        //設置矩陣模式為視圖矩陣(模型)
                glLoadIdentity();                //變為單位矩陣
            }


            //閑置函數,當主循環空閑時就會調用這個函數
            void MyIdle(void)
            {
                Sleep(
            10);
                xrot
            +=0.3f;        //增加旋轉的角度。
                yrot+=0.2f;
                zrot
            +=0.4f;                                    
                glutPostRedisplay();
            }


            int main(int argc, char** argv)
            {
                glutInit(
            &argc, argv);        //Opnegl初始化
                glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA); //設置顯示模式為雙緩沖,RGEBA

                glutInitWindowSize (
            800600);            //窗口大小
                glutInitWindowPosition (100100);        //窗口位置
                glutCreateWindow ("hello");                //創建一個標題為hello的窗口
                init ();                                //初始化資源,這里一定要在創建窗口以后,不然會無效。
                glutDisplayFunc(display);                //窗口大小改變時的回調
                glutReshapeFunc(reshape);                //繪制圖形時的回調
                glutIdleFunc(MyIdle);
                glutMainLoop();                            
            //主循環。
                return 0;  
            }

             

            主要流程:

            OpneGL的流程,先初始化。

            1. 在Init函數中,初始化我們的信息:

            glClearColor (0.0, 0.0, 0.0, 0.0); //清理顏色,為黑色,(也可認為是背景顏色)

            glCullFace(GL_BACK); //背面裁剪(背面不可見)

            glEnable(GL_CULL_FACE); //啟用裁剪

            glEnable(GL_TEXTURE_2D);

            LoadGLTextures(g_texture"Data/NeHe.bmp"); //載入紋理貼圖

            這里的順序是可以打亂的,記住一定要載入紋理,我這里是寫了一個函數來載入。然后要啟用紋理貼圖。glEnable(GL_TEXTURE_2D);。還有一件事情是比不可少的,就是一定要啟用裁剪,并且一定要用GL_BACK。我也不知道為什么,反正用glut創建的窗口就不可以,如果是直接用windows下創建的不用這個也是可以的。原理暫時還不清楚。

            2 . 然后是繪制圖形:

            就是繪制一個正方體,并貼上圖。

            glTexCoord2f(0.0f, 1.0f); 這是貼圖的紋理坐標,在0-1范圍內,他就是把一張紋理看成0-1的區域,這就是用他該區域的紋理貼圖。

            glVertex3f(-1.0f,  1.0f, -1.0f); //畫點,這里畫點后,他的紋理就有上面的貼圖的紋理坐標來確定。就確定了這點的貼圖信息。

            3.新加了一個idle函數,他能在循環空閑的時候調用,我們用他來改變旋轉的角度并重畫圖形,這樣就可以看到圖形動起來了。

            posted on 2009-04-25 11:07 shongbee2 閱讀(16036) 評論(1)  編輯 收藏 引用 所屬分類: OpenGL

            評論

            # re: OpenGL學習筆記【4】——給立方體紋理貼圖(texture) 2012-05-15 21:22 zwx

            代碼很經典呀。  回復  更多評論   

            久久精品视频91| 久久久久人妻精品一区二区三区 | 2019久久久高清456| 97久久婷婷五月综合色d啪蜜芽 | 久久久久久亚洲精品不卡| 久久性生大片免费观看性| 午夜人妻久久久久久久久| 国产精品无码久久四虎| 久久无码人妻一区二区三区午夜| 亚洲国产精久久久久久久| 久久精品国产99国产精品导航| 久久国产乱子精品免费女| 国产精品久久久久久久app| 久久免费美女视频| 久久国产免费观看精品3| 久久综合成人网| 国产精品九九久久免费视频| 性欧美丰满熟妇XXXX性久久久| 无码人妻少妇久久中文字幕| 精品久久久久中文字幕日本| 久久精品中文字幕一区| 久久精品亚洲男人的天堂 | 久久精品国产WWW456C0M| 国产精品久久波多野结衣| 亚洲狠狠婷婷综合久久蜜芽| 亚洲精品美女久久久久99小说| 欧美精品一区二区精品久久| 99久久综合狠狠综合久久止| 久久发布国产伦子伦精品| 亚洲成色WWW久久网站| 久久精品一区二区三区AV| 久久午夜免费视频| 久久无码国产专区精品| 三级片免费观看久久| 欧美伊人久久大香线蕉综合69| 久久精品99无色码中文字幕| 国产精品无码久久久久| 久久青青草原精品国产软件| 久久综合精品国产一区二区三区 | 成人久久免费网站| 久久久久久国产精品无码下载|