• <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久久精一区二区三区大全| 精品国产一区二区三区久久久狼 | 久久精品国产清自在天天线| 一本伊大人香蕉久久网手机| 人妻丰满AV无码久久不卡| 97久久超碰国产精品旧版| 无码久久精品国产亚洲Av影片 | www性久久久com| 久久久久99精品成人片试看| 久久国产色AV免费观看| 2020久久精品国产免费| 91精品国产91久久久久久青草| 婷婷久久综合九色综合98| 国产精品嫩草影院久久| 久久午夜无码鲁丝片午夜精品| 久久青青色综合| 久久夜色精品国产噜噜噜亚洲AV| 久久亚洲AV成人无码国产| 99久久无色码中文字幕| 久久露脸国产精品| 精品国产乱码久久久久久呢 | 久久精品国产99久久丝袜| 亚洲精品国精品久久99热| 无码人妻久久久一区二区三区| 国产精品久久久久aaaa| 久久久久成人精品无码 | 日韩人妻无码精品久久免费一| 国内精品久久久久久99蜜桃| 草草久久久无码国产专区| 久久精品国产亚洲av麻豆图片| 久久99国产综合精品女同| 久久精品亚洲福利| 久久青青草原亚洲av无码app| 很黄很污的网站久久mimi色| 国产亚洲美女精品久久久2020| 日韩精品国产自在久久现线拍 | 久久久精品人妻一区二区三区四| 久久99亚洲综合精品首页| 国产精品对白刺激久久久| 欧美午夜精品久久久久久浪潮| 久久久久人妻精品一区 |