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

            Shuffy

            不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
            posts - 102, comments - 43, trackbacks - 0, articles - 19

                 本文在9篇文章的基礎(chǔ)上,為立方體加入紋理映射的功能。

            Texture Mapping

            Texture Mapping in OpenGL is a fairly straightforward concept. Every texture is nothing but an image of some sort. Texture mapping is basically applying a texture to a surface. Textures can be 1D, 2D or even 3D. A 1D texture is an image with either a width or a height, not both. They are not very useful. 2D textures have both width and height and are very useful. 3D textures are called Volume textures and are used in medical imaging applications for viewing CAT, MRI, and other 3D scans. We will look at using 2D textures in OpenGL as they are the most widely used in 3D Graphics.

            Windows Bitmap Files

            Images in Windows are typically stored in bitmap files. These images can be used as textures that will be applied to OpenGL surfaces. But before use them for texture mapping applications we should convert them to an OpenGL format. So we essentially have to read a Windows Bitmap into an OpenGL image. We can use the Auxiliary library to do so. It takes care of all the trouble involved in performing this conversion. Once a texture map is read into memory, the individual elements are called texels, just like an image's individual elements are called pixels. We wouldn't be dealing with these texels as we would be using the Aux library routine auxDIBImageLoadA to perform the conversion for us. Also, we need to make sure that the image dimensions are a power of 2. OpenGL images that we are going to use as a texture must have dimensions of a power of 2. Thus 32X32, 64X64, 128X64 etc. are all valid image sizes to be used as texture maps.

            Defining 2D Textures

            To define a 2D texture image in OpenGL we call glTexImage2D (when we are not using Mipmapping).

            Mipmapping

            When texture mapping is used with animation scaling of images cause some visual artifacts. This can be avoided by generating textures of various sizes from a large original texture and letting OpenGL automatically switch between the textures of various sizes. This technique is called Mipmapping and the individual textures are called Mipmaps. We can use the function gluBuild2DMipMaps to construct a series of mipmaps.

            Texture Modes

            OpenGL defines three texturing modes for different types of rendering. The first is GL_MODULATE, which modulates the current lighting and color information with the texture image. GL_DECAL is the second mode which only uses the texture image. Color and Lighting information will not affect the texture's appearance. The last mode is GL_BLEND, in which the texture image is blended with the current texture color and the current lighting and color information.

            Texture Filters

            OpenGL uses texture filters to interpolate between the texture pixels. It provides two types of texture filters: the minification filter (GL_TEXTURE_MIN_FILTER) for polygons smaller than the texture image and the magnification filter (GL_TEXTURE_MAG_FILTER) for polygons that are larger than the texture image. We'll look at how we will use these later in the tutorial.

            Texture Coordinates

            Texture Coordinates associate a particular location in the texture image with vertices in a polygon. These coordinates determine how the texture is mapped onto the polygon. Texture coordinates lie between 0.0 and 1.0 in case of 2D textures.

            Texture Wrapping

            When texture coordinates go outside the range of 0.0 to 1.0, they are either clamped to the surface or repeated. This can be specified by setting the GL_TEXTURE_WRAP_* parameter appropriately, to either GL_CLAMP or GL_REPEAT.

            Texture Objects

            Texture objects are a way of loading and maintaining multiple textures in memory without loading them each time before they are used. They are an optimization feature introduced recently in OpenGL.

            1,CCY457OpenGLView類中加入下列變量,分別代表紋理環(huán)繞,紋理過(guò)濾,紋理模式的參數(shù)。

                GLdouble m_texWrap, m_texFilter, m_texMode;  
                
            //All Texture Names
                 GLuint m_Texture[3]; //保存紋理對(duì)象的名稱

             并在構(gòu)造函數(shù)中加入:

            CCY457OpenGLView::CCY457OpenGLView()
            {
                m_xRot 
            = 0.0f;
                m_yRot 
            = 0.0f;
                m_texWrap 
            = GL_CLAMP;
                m_texMode 
            = GL_DECAL;
                m_texFilter 
            = GL_NEAREST;
            }

            2,加載紋理對(duì)象。

            //Texture Mapping Functions
            void CCY457OpenGLView::LoadGLTextures()
            {
                
            //Create Texture Names
                glGenTextures(3, m_Texture);
                LoadTexture(
            "Apple.bmp",0);
                LoadTexture(
            "Fauve.bmp",1);
                LoadTexture(
            "Flower.bmp",2);
            }
            void CCY457OpenGLView::LoadTexture (CString fileName, int texName)
            {
                
            //Load Texture
                AUX_RGBImageRec* m_texture;
                m_texture 
            = auxDIBImageLoad((const char*)fileName);
                
            if(!m_texture)
                {
                    MessageBox(
            "Picture could not be loaded");
                    exit(
            1);
                }
                glBindTexture(GL_TEXTURE_2D, m_Texture[texName]);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, m_texWrap);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, m_texWrap);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, m_texFilter);
                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_texFilter);
                glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, m_texMode);
                gluBuild2DMipmaps(GL_TEXTURE_2D, 
            3, m_texture->sizeX,m_texture->sizeY, GL_RGB, GL_UNSIGNED_BYTE, m_texture->data);
            }

             3,加入控制紋理映射效果的各個(gè)菜單項(xiàng)及其事件處理程序

            void CCY457OpenGLView::OnTexturewrapGlclamp() 
            {
                m_texWrap 
            = GL_CLAMP;
                LoadGLTextures();
                InvalidateRect(NULL,FALSE);    
            }
            void CCY457OpenGLView::OnUpdateTexturewrapGlclamp(CCmdUI* pCmdUI) 
            {
                
            if(m_texWrap == GL_CLAMP)
                    pCmdUI
            ->SetRadio();
                
            else
                    pCmdUI
            ->SetRadio(FALSE);    
            }
            void CCY457OpenGLView::OnTexturewrapGlrepeat() 
            {
                m_texWrap 
            = GL_REPEAT;
                LoadGLTextures();
                InvalidateRect(NULL,FALSE);
            }
            void CCY457OpenGLView::OnUpdateTexturewrapGlrepeat(CCmdUI* pCmdUI) 
            {
                
            if(m_texWrap == GL_REPEAT)
                    pCmdUI
            ->SetRadio();        
                
            else
                    pCmdUI
            ->SetRadio(FALSE);
            }
            void CCY457OpenGLView::OnTexturefilterGlnearest() 
            {
                m_texFilter 
            = GL_NEAREST;
                LoadGLTextures();
                InvalidateRect(NULL,FALSE);        
                
            }
            void CCY457OpenGLView::OnUpdateTexturefilterGlnearest(CCmdUI* pCmdUI) 
            {
                
            if(m_texFilter == GL_NEAREST)
                    pCmdUI
            ->SetRadio();    
                
            else
                    pCmdUI
            ->SetRadio(FALSE);    
            }
            void CCY457OpenGLView::OnTexturefilterGllinear() 
            {
                m_texFilter 
            = GL_LINEAR;
                LoadGLTextures();
                InvalidateRect(NULL,FALSE);        
            }
            void CCY457OpenGLView::OnUpdateTexturefilterGllinear(CCmdUI* pCmdUI) 
            {
                
            if(m_texFilter == GL_LINEAR)
                    pCmdUI
            ->SetRadio();    
                
            else
                    pCmdUI
            ->SetRadio(FALSE);    
            }
            void CCY457OpenGLView::OnTexturemodeGlmodulate() 
            {
                m_texMode 
            = GL_MODULATE;
                LoadGLTextures();
                InvalidateRect(NULL,FALSE);
            }
            void CCY457OpenGLView::OnUpdateTexturemodeGlmodulate(CCmdUI* pCmdUI) 
            {
                
            if(m_texMode == GL_MODULATE)
                    pCmdUI
            ->SetRadio();                
                
            else
                    pCmdUI
            ->SetRadio(FALSE);    
            }
            void CCY457OpenGLView::OnTexturemodeGldecal() 
            {
                m_texMode 
            = GL_DECAL;
                LoadGLTextures();
                InvalidateRect(NULL,FALSE);
            }
            void CCY457OpenGLView::OnUpdateTexturemodeGldecal(CCmdUI* pCmdUI) 
            {
                
            if(m_texMode == GL_DECAL)
                    pCmdUI
            ->SetRadio();                
                
            else
                    pCmdUI
            ->SetRadio(FALSE);
            }
            void CCY457OpenGLView::OnTexturemodeGlblend() 
            {
                m_texMode 
            = GL_BLEND;
                LoadGLTextures();
                InvalidateRect(NULL,FALSE);
            }
            void CCY457OpenGLView::OnUpdateTexturemodeGlblend(CCmdUI* pCmdUI) 
            {
                
            if(m_texMode == GL_BLEND)
                    pCmdUI
            ->SetRadio();                
                
            else
                    pCmdUI
            ->SetRadio(FALSE);
            }

            4,在InitializeOpenGL()中加入如下調(diào)用:

                //加載紋理
                LoadGLTextures();

            5,繪制函數(shù)修改如下:

            void CCY457OpenGLView::RenderScene ()
            {
            //繪制函數(shù)
                    glTranslatef(0.0f,0.0f,-5.0f);
                    glRotatef(m_xRot,
            1.0f,0.0f,0.0f);
                    glRotatef(m_yRot,
            0.0f,1.0f,0.0f);
                    glEnable(GL_TEXTURE_2D);
                    glBindTexture(GL_TEXTURE_2D,m_Texture[
            0]);
                    
            //Front Face
                    glBegin(GL_POLYGON);
                        glTexCoord2f(
            0,0);
                        glVertex3f(
            -1.0f,-1.0f,0.0f);
                        glTexCoord2f(
            1,0);
                        glVertex3f( 
            1.0f,-1.0f,0.0f);
                        glTexCoord2f(
            1,1);
                        glVertex3f( 
            1.0f1.0f,0.0f);
                        glTexCoord2f(
            0,1);
                        glVertex3f(
            -1.0f1.0f,0.0f);
                    glEnd();
                    
            //Back Face
                    glBegin(GL_POLYGON);
                        glTexCoord2f(
            1,0);
                        glVertex3f(
            -1.0f,-1.0f,-1.0f);
                        glTexCoord2f(
            1,1);
                        glVertex3f(
            -1.0f1.0f,-1.0f);
                        glTexCoord2f(
            0,1);
                        glVertex3f( 
            1.0f1.0f,-1.0f);
                        glTexCoord2f(
            0,0);
                        glVertex3f( 
            1.0f,-1.0f,-1.0f);
                    glEnd();
                    glBindTexture(GL_TEXTURE_2D,m_Texture[
            1]);
                    
            //Left Face
                    glBegin(GL_POLYGON);
                        glTexCoord2f(
            1,0);
                        glVertex3f(
            -1.0f,-1.0f0.0f);
                        glTexCoord2f(
            1,1);
                        glVertex3f(
            -1.0f1.0f0.0f);
                        glTexCoord2f(
            0,1);
                        glVertex3f(
            -1.0f1.0f,-1.0f);
                        glTexCoord2f(
            0,0);
                        glVertex3f(
            -1.0f,-1.0f,-1.0f);
                    glEnd();
                    
            //Right Face
                    glBegin(GL_POLYGON);
                        glTexCoord2f(
            0,0);
                        glVertex3f(
            1.0f,-1.0f0.0f);
                        glTexCoord2f(
            1,0);
                        glVertex3f(
            1.0f,-1.0f,-1.0f);
                        glTexCoord2f(
            1,1);
                        glVertex3f(
            1.0f1.0f,-1.0f);
                        glTexCoord2f(
            0,1);
                        glVertex3f(
            1.0f1.0f0.0f);
                    glEnd();
                    glBindTexture(GL_TEXTURE_2D,m_Texture[
            2]);
                    
            //Top Face
                    glBegin(GL_POLYGON);
                        glTexCoord2f(
            0,0);
                        glVertex3f(
            -1.0f1.0f,  0.0f);
                        glTexCoord2f(
            0,1);
                        glVertex3f( 
            1.0f1.0f,  0.0f);
                        glTexCoord2f(
            1,1);
                        glVertex3f( 
            1.0f1.0f-1.0f);
                        glTexCoord2f(
            1,0);
                        glVertex3f(
            -1.0f1.0f-1.0f);
                    glEnd();
                    
            //Botton Face
                    glBegin(GL_POLYGON);
                        glTexCoord2f(
            0,1);
                        glVertex3f(
            -1.0f-1.0f,  0.0f);
                        glTexCoord2f(
            0,0);
                        glVertex3f(
            -1.0f-1.0f-1.0f);
                        glTexCoord2f(
            1,0);
                        glVertex3f( 
            1.0f-1.0f-1.0f);
                        glTexCoord2f(
            1,1);
                        glVertex3f( 
            1.0f-1.0f,  0.0f);
                    glEnd();
                    glDisable(GL_TEXTURE_2D);
            }

             

             

            作者:洞庭散人

            出處:http://phinecos.cnblogs.com/    

            本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
            原文鏈接:http://www.cnblogs.com/phinecos/archive/2008/11/05/1327646.html
            亚洲天堂久久精品| 亚洲成av人片不卡无码久久| 亚洲精品高清国产一线久久| 东京热TOKYO综合久久精品| 亚洲国产成人精品91久久久| 久久伊人精品一区二区三区| 国产高潮国产高潮久久久91 | 久久午夜无码鲁丝片| 狠狠色丁香婷婷综合久久来来去| 久久亚洲私人国产精品| 国产精品激情综合久久| 婷婷久久五月天| 久久久久国色AV免费观看 | 亚洲欧美精品伊人久久| 久久WWW免费人成一看片| 久久中文字幕视频、最近更新| 亚洲嫩草影院久久精品| 亚洲中文久久精品无码| 亚洲AV日韩AV天堂久久| 久久精品二区| 久久精品国产99国产电影网| 国产一级持黄大片99久久| 久久中文字幕人妻丝袜| 日韩美女18网站久久精品| 久久香蕉一级毛片| 久久精品夜色噜噜亚洲A∨| 国产成人久久精品一区二区三区| 久久人人爽人人爽人人片AV麻烦| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 四虎影视久久久免费观看| 93精91精品国产综合久久香蕉 | 久久久精品人妻一区二区三区四| 亚洲国产精品18久久久久久| 久久婷婷色综合一区二区| 欧美黑人又粗又大久久久| 久久久久国产精品嫩草影院| 俺来也俺去啦久久综合网| 国产激情久久久久久熟女老人| 国产精品美女久久久久av爽 | 无遮挡粉嫩小泬久久久久久久| 久久久久这里只有精品|