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

            隨感而發(fā)

            雜七雜八

            統(tǒng)計

            留言簿(13)

            閱讀排行榜

            評論排行榜

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

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

            #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);            //旋轉(zhuǎn)矩陣,這里繞x軸旋轉(zhuǎn)。
                glRotatef(yrot,0.0f,1.0f,0.0f);            //旋轉(zhuǎn)矩陣,這里繞y軸旋轉(zhuǎn)。
                glRotatef(zrot,0.0f,0.0f,1.0f);            //繞z軸旋轉(zhuǎn),這里zrot是角度制的度數(shù)。

                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);    // 清楚顏色數(shù)據(jù)和深度數(shù)據(jù)(清屏)
                glLoadIdentity();                                    // Reset The View
                glTranslatef(0.0f,0.0f,-5.0f);

                DrawCube();

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


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

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

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

                
            //設(shè)置紋理的信息,
                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); 
            //設(shè)置濾波為線性濾波
                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");            //載入紋理貼圖
            }


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

                glViewport(
            0,0,w,h);        //設(shè)置視口
                glMatrixMode(GL_PROJECTION);    //設(shè)置矩陣模式為投影變換矩陣,
                glLoadIdentity();                //變?yōu)閱挝痪仃?/span>
                gluPerspective(60, (GLfloat)w / h, 01000);    //設(shè)置投影矩陣
                glMatrixMode(GL_MODELVIEW);        //設(shè)置矩陣模式為視圖矩陣(模型)
                glLoadIdentity();                //變?yōu)閱挝痪仃?/span>
            }


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


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

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

             

            主要流程:

            OpneGL的流程,先初始化。

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

            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"); //載入紋理貼圖

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

            2 . 然后是繪制圖形:

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

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

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

            3.新加了一個idle函數(shù),他能在循環(huán)空閑的時候調(diào)用,我們用他來改變旋轉(zhuǎn)的角度并重畫圖形,這樣就可以看到圖形動起來了。

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

            評論

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

            代碼很經(jīng)典呀。  回復(fù)  更多評論   

            欧美亚洲另类久久综合| 久久www免费人成精品香蕉| 精品国产乱码久久久久久郑州公司 | 久久成人国产精品二三区| 国内精品久久久久久久coent| 亚洲精品美女久久久久99小说 | A级毛片无码久久精品免费| 色8久久人人97超碰香蕉987| 久久中文娱乐网| 亚洲级αV无码毛片久久精品| 成人午夜精品久久久久久久小说| 精品伊人久久久| 狠狠人妻久久久久久综合蜜桃| 99久久国产综合精品女同图片| 狠狠色丁香婷婷综合久久来来去| 久久www免费人成看片| 色综合久久天天综合| 亚洲欧美成人综合久久久| 久久久久18| 国产精品伦理久久久久久| 国产成人无码久久久精品一| 久久精品国产乱子伦| 蜜桃麻豆www久久国产精品| 久久九九有精品国产23百花影院| 久久精品国产亚洲av麻豆图片| 久久精品视屏| 久久久久久A亚洲欧洲AV冫| 亚洲精品高清久久| 69国产成人综合久久精品| 久久精品九九亚洲精品| 久久91精品国产91| 99久久免费国产精品特黄| 日韩久久无码免费毛片软件| 久久青青草原亚洲av无码| 久久99精品九九九久久婷婷| 7国产欧美日韩综合天堂中文久久久久 | 亚洲欧美精品一区久久中文字幕 | 一本综合久久国产二区| 久久久综合香蕉尹人综合网| yellow中文字幕久久网| 精品无码久久久久久久久久|