• <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)計(jì)

            留言簿(13)

            閱讀排行榜

            評(píng)論排行榜

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

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

            #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


            //繪制一個(gè)立方體
            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);  
            //啟用四邊形帶繪制模式繪制

                
            // 繪制前面,這里開始確定紋理坐標(biāo),然后是確定點(diǎn)的位置
                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ū)。顯示圖形
            }


            //載入一個(gè).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)建一個(gè)紋理,unTexture

                glBindTexture(GL_TEXTURE_2D, unTexture);        
            //綁定紋理,然后對(duì)該紋理區(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);            //清理顏色,為黑色,(也可認(rèn)為是背景顏色)

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


            //當(dāng)窗口大小改變時(shí),會(huì)調(diào)用這個(gè)函數(shù)
            void reshape(GLsizei w,GLsizei h)
            {
                
            //這里小說(shuō)明一下:矩陣模式是不同的,他們各自有一個(gè)矩陣。投影相關(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ù),當(dāng)主循環(huán)空閑時(shí)就會(huì)調(diào)用這個(gè)函數(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)建一個(gè)標(biāo)題為hello的窗口
                init ();                                //初始化資源,這里一定要在創(chuàng)建窗口以后,不然會(huì)無(wú)效。
                glutDisplayFunc(display);                //窗口大小改變時(shí)的回調(diào)
                glutReshapeFunc(reshape);                //繪制圖形時(shí)的回調(diào)
                glutIdleFunc(MyIdle);
                glutMainLoop();                            
            //主循環(huán)。
                return 0;  
            }

             

            主要流程:

            OpneGL的流程,先初始化。

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

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

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

            glEnable(GL_CULL_FACE); //啟用裁剪

            glEnable(GL_TEXTURE_2D);

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

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

            2 . 然后是繪制圖形:

            就是繪制一個(gè)正方體,并貼上圖。

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

            glVertex3f(-1.0f,  1.0f, -1.0f); //畫點(diǎn),這里畫點(diǎn)后,他的紋理就有上面的貼圖的紋理坐標(biāo)來(lái)確定。就確定了這點(diǎn)的貼圖信息。

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

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

            評(píng)論

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

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

            91性高湖久久久久| 亚洲日本va中文字幕久久| 国产精品九九久久免费视频 | 国产精品久久久久久一区二区三区| 色偷偷88888欧美精品久久久| 国产精品视频久久| 久久男人AV资源网站| 久久香蕉超碰97国产精品| 国产午夜精品久久久久九九| 性欧美丰满熟妇XXXX性久久久 | 国产激情久久久久影院小草 | 热re99久久6国产精品免费| 88久久精品无码一区二区毛片| 亚洲精品无码久久毛片| 国产精品免费看久久久| 午夜精品久久影院蜜桃| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 国产一区二区精品久久岳| 久久精品aⅴ无码中文字字幕重口| 久久久精品久久久久久| 久久精品国产精品青草app| 久久国产欧美日韩精品| 日韩亚洲国产综合久久久| 欧美久久综合性欧美| 久久久精品国产sm调教网站| 2021国内精品久久久久久影院| 国产精品无码久久四虎| 亚洲国产成人久久综合碰碰动漫3d| 亚洲AV无码1区2区久久| 久久亚洲日韩看片无码| 久久亚洲精品成人无码网站| 亚洲国产日韩综合久久精品| 精品久久久久久国产免费了| 亚洲国产成人久久综合碰碰动漫3d | 亚洲国产精品久久久久婷婷老年| 日日躁夜夜躁狠狠久久AV| 久久精品国产2020| 久久亚洲精品成人AV| 精品久久久久久无码中文字幕一区| 久久人人爽人人爽人人片av高请 | 久久久久亚洲国产|