青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

  C++博客 :: 首頁 :: 聯(lián)系 ::  :: 管理
  163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

常用鏈接

留言簿(48)

我參與的團(tuán)隊

搜索

  •  

積分與排名

  • 積分 - 402530
  • 排名 - 59

最新評論

閱讀排行榜

評論排行榜

在發(fā)布了前兩篇關(guān)于位圖字體和輪廓字體的教程以后,我收到很多郵件,很多讀者都想知道如何才能給字體賦予紋理貼圖。你可以使用自動紋理坐標(biāo)生成器。它會為字體上的每一個多邊形生成紋理坐標(biāo)。
一個小注釋,這段代碼是專門針對Windows寫的,它使用了Windows的wgl函數(shù)來創(chuàng)建字體,顯然,Apple機(jī)系統(tǒng)有agl,X系統(tǒng)有g(shù)lx來支持做同樣事情的,不幸的是,我不能保證這些代碼也是容易使用的。如果哪位有能在屏幕上顯示文字且獨(dú)立于平臺的代碼,請告訴我,我將重寫一個有關(guān)字體的教程。

我們將使用第14課的代碼來創(chuàng)作紋理字體的演示。如果程序中哪部分的代碼有變化,我會重寫那部分的所有代碼以便看出我做的改動。

 
  
  
 我們還要添加一個叫做texture[]的整型變量。它用于保存紋理。后面3行是第14課中的代碼,本課不做改動。
 
  
  
 下面的部分做了一些小改動。我打算在這課使用wingdings字體來顯示一個海盜旗(骷髏頭和十字骨頭)的標(biāo)志。如果你想顯示文字的話,就不用改動第14課中的代碼了,也可以選擇另一種字體。
有些人想知道如何使用wingdings字體,這也是我不用標(biāo)準(zhǔn)字體的一個原因。wingdings是一種符號字體,使用它時需要做一些改動。告訴Windows使用wingdings字體并不太簡單。如果你把字體的名字改為wingdings,你會注意到字體其實(shí)并沒有選到。你必須告訴Windows這種字體是一種符號字體而不是一種標(biāo)準(zhǔn)字符字體。后面會繼續(xù)解釋。

 
  

GLvoid BuildFont(GLvoid)                        // 創(chuàng)建位圖字體
{
    GLYPHMETRICSFLOAT    gmf[256];                    // 記錄256個字符的信息
    HFONT    font;                        // 字體句柄

    base = glGenLists(256);                    // 創(chuàng)建256個顯示列表
    font = CreateFont(    -12,                    // 字體高度
                0,                // 字體寬度
                0,                // 字體的旋轉(zhuǎn)角度 Angle Of Escapement
                0,                // 字體底線的旋轉(zhuǎn)角度Orientation Angle
                FW_BOLD,                // 字體的重量
                FALSE,                // 是否使用斜體
                FALSE,                // 是否使用下劃線
                FALSE,                // 是否使用刪除線

  
 這就是有魔力的那一行!不使用第14課中的ANSI_CHARSET,我們將使用SYMBOL_CHARSET。這會告訴Windows我們創(chuàng)建的字體并不是由標(biāo)準(zhǔn)字符組成的典型字體。所謂符號字體通常是由一些小圖片(符號)組成的。如果你忘了改變這行,wingdings,webdings以及你想用的其它符號字體就不會工作。
 
  

                SYMBOL_CHARSET,            // 設(shè)置字符集

  
 下面幾行沒有變化。
 
  

                OUT_TT_PRECIS,            // 輸出精度
                CLIP_DEFAULT_PRECIS,        // 裁剪精度
                ANTIALIASED_QUALITY,        // 輸出質(zhì)量
                FF_DONTCARE|DEFAULT_PITCH,        // Family And Pitch

  
 既然我們已經(jīng)選擇了符號字符集標(biāo)識符,我們就可以選擇wingdings字體了 
  

                "Wingdings");            // 字體名稱

  
 剩下幾行代碼沒有變化 
  

    SelectObject(hDC, font);                    // 選擇創(chuàng)建的字體

    wglUseFontOutlines(    hDC,                // 設(shè)置當(dāng)前窗口設(shè)備描述表的句柄
                0,                // 用于創(chuàng)建顯示列表字體的第一個字符的ASCII值
                255,                // 字符數(shù)
                base,                // 第一個顯示列表的名稱

  
 我們允許有更多的誤差,這意味著GL不會嚴(yán)格的遵守字體的輪廓線。如果你把誤差設(shè)置為0.0f,你就會發(fā)現(xiàn)嚴(yán)格地在曲面上貼圖存在一些問題。但是如果你允許一定的誤差,很多問題都可以避免。
 
  

                0.1f,                // 字體的光滑度,越小越光滑,0.0為最光滑的狀態(tài)

  
 下面三行代碼還是相同的 
  

                0.2f,                // 在z方向突出的距離
                WGL_FONT_POLYGONS,            // 使用多邊形來生成字符,每個頂點(diǎn)具有獨(dú)立的法線
                gmf);                // 一個接收字形度量數(shù)據(jù)的數(shù)組的地址,每個數(shù)組元素用它對應(yīng)的顯示列表字符的數(shù)據(jù)填充
}

  
 在ReSizeGLScene()函數(shù)之前,我們要加上下面一段代碼來讀取紋理。你可能會認(rèn)得這些前幾課中的代碼。我們創(chuàng)建一個保存位圖的地方,讀取位圖,告訴Windows生成一個紋理,并把它保存在texture[0]中。
我們創(chuàng)建一種細(xì)化紋理(mipmapped texture),這樣會看起來好些。紋理的名字叫做lights.bmp。
 
  

if (TextureImage[0]=LoadBMP("Data/Lights.bmp"))            // 載入位圖

  
 下面四行代碼將為我們繪制在屏幕上的任何物體自動生成紋理坐標(biāo)。函數(shù)glTexGen非常強(qiáng)大,而且復(fù)雜,如果要完全講清楚它的數(shù)學(xué)原理需要再寫一篇教程。不過,你只要知道GL_S和GL_T是紋理坐標(biāo)就可以了。默認(rèn)狀態(tài)下,它被設(shè)置為提取物體此刻在屏幕上的x坐標(biāo)和y坐標(biāo),并把它們轉(zhuǎn)換為頂點(diǎn)坐標(biāo)。你會發(fā)現(xiàn)到物體在z平面沒有紋理,只顯示一些斑紋。正面和反面都被賦予了紋理,這些都是由glTexGen函數(shù)產(chǎn)生的。(X(GL_S)用于從左到右映射紋理,Y(GL_T)用于從上到下映射紋理。
GL_TEXTURE_GEN_MODE允許我們選擇我們想在S和T紋理坐標(biāo)上使用的紋理映射模式。你有3種選擇:

GL_EYE_LINEAR - 紋理會固定在屏幕上。它永遠(yuǎn)不會移動。物體將被賦予處于它通過的地區(qū)的那一塊紋理。

GL_OBJECT_LINEAR - 這種就是我們使用的模式。紋理被固定于在屏幕上運(yùn)動的物體上。
GL_SPHERE_MAP - 每個人都喜歡。創(chuàng)建一種有金屬質(zhì)感的物體。

 
  

        // 設(shè)置紋理映射模式
        glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
        glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
        glEnable(GL_TEXTURE_GEN_S);                // 使用自動生成紋理
        glEnable(GL_TEXTURE_GEN_T);       
  
 在InitGL()的最后有幾行新代碼。BuildFont()被放到了讀取紋理的代碼之后。glEnable(GL_COLOR_MATERIAL) 這行被刪掉了,如果你想使用glColor3f(r,g,b)來改變紋理的顏色,那么就把glEnable(GL_COLOR_MATERIAL)這行重新加到這部分代碼中。 
  

int InitGL(GLvoid)                            // 此處開始對OpenGL進(jìn)行所有設(shè)置
{
    if (!LoadGLTextures())                    // 載入紋理
    {
        return FALSE;                    // 失敗則返回
    }
    BuildFont();                        // 創(chuàng)建字體顯示列表

    glShadeModel(GL_SMOOTH);                    // 啟用陰影平滑
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);            // 黑色背景
    glClearDepth(1.0f);                    // 設(shè)置深度緩存
    glEnable(GL_DEPTH_TEST);                    // 啟用深度測試
    glDepthFunc(GL_LEQUAL);                    // 所作深度測試的類型
    glEnable(GL_LIGHT0);                    // 使用第0號燈
    glEnable(GL_LIGHTING);                    // 使用光照
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);        // 告訴系統(tǒng)對透視進(jìn)行修正

  
 啟動2D紋理映射,并選擇第一個紋理。這樣就把第一個紋理映射到我們繪制在屏幕上的3D物體上了。如果你想加入更多的操作,可以按自己的意愿啟動或禁用紋理映射。 
  

    glEnable(GL_TEXTURE_2D);                    // 使用二維紋理
    glBindTexture(GL_TEXTURE_2D, texture[0]);            // 選擇使用的紋理
    return TRUE;                        // 初始化成功
}

  
 重置大小的代碼沒有變化,但DrawGLScene這部分代碼有變化。 
  
  
 這里是第一處變動。我們打算使用COS和SIN讓物體繞著屏幕旋轉(zhuǎn)而不是把它固定在屏幕中間。我們將把物體向屏幕里移動3個單位。在x軸,我們將移動范圍限制在-1.1到+1.1之間。我們使用rot變量來控制左右移動。我們把上下移動的范圍限制在+0.8到-0.8之間。同樣使用rot變量來控制上下移動(最好充分利用你的變量)。 
  

    // 設(shè)置字體的位置
    glTranslatef(1.1f*float(cos(rot/16.0f)),0.8f*float(sin(rot/20.0f)),-3.0f);

  
 下面做常規(guī)的旋轉(zhuǎn)。這會使符號在X,Y和Z軸旋轉(zhuǎn)。 
  

    glRotatef(rot,1.0f,0.0f,0.0f);                // 沿X軸旋轉(zhuǎn)
    glRotatef(rot*1.2f,0.0f,1.0f,0.0f);                // 沿Y軸旋轉(zhuǎn)
    glRotatef(rot*1.4f,0.0f,0.0f,1.0f);                // 沿Z軸旋轉(zhuǎn)

  
 我們將物體相對觀察點(diǎn)向左向下移動一點(diǎn),以便于把符號定位于每個軸的中心。否則,當(dāng)我們旋轉(zhuǎn)它的時候,看起來就不像是在圍繞它自己的中心在旋轉(zhuǎn)。-0.35只是一個能讓符號正確顯示的數(shù)。我也試過一些其它數(shù),因為我不知道這種字體的寬度是多少,可以適情況作出調(diào)整。我不知道為什么這種字體沒有一個中心。 
  

    glTranslatef(-0.35f,-0.35f,0.1f);                // 移動到可以顯示的位置

  
 最后,我們繪制海盜旗的符號,然后增加rot變量,從而使這個符號在屏幕中旋轉(zhuǎn)和移動。如果你不知道我是如何從字母‘N’中得到海盜旗符號的,那就打開Microsoft Word或是寫字板。在字體下拉菜單中選擇Wingdings字體。輸入大寫字母‘N’,就會顯示出海盜旗符號了。 
  

    glPrint("N");                        // 繪制海盜旗符號
    rot+=0.1f;                        // 增加旋轉(zhuǎn)變量

  
 最后要做的事就是在KillGLWindow()的最后添加KillFont()函數(shù),如下所示。添加這行代碼很重要。它將在我們退出程序之前做清理工作。
 
  
  
 盡管我沒有講的細(xì)致入微,但我想你應(yīng)該很好的理解了如何讓OpenGL為你生成紋理坐標(biāo)。在給你的字體或者是同類物體賦予紋理映射時,應(yīng)該沒有問題了,而且只需要改變兩行代碼,你就可以啟用球體映射了,它的效果簡直酷斃了!

 


posted on 2007-12-14 14:30 sdfasdf 閱讀(674) 評論(0)  編輯 收藏 引用 所屬分類: OPENGL
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            狠狠色噜噜狠狠狠狠色吗综合| 亚洲精品日本| 国产欧美日韩综合一区在线播放| 免费人成网站在线观看欧美高清 | 麻豆九一精品爱看视频在线观看免费| 亚洲精品国产精品国自产在线 | 欧美国产日韩一区二区三区| 久久综合久久综合久久| 久久久久免费| 免费人成精品欧美精品| 亚洲第一中文字幕| 久久久亚洲高清| 欧美本精品男人aⅴ天堂| 欧美.www| 99亚洲伊人久久精品影院红桃| 亚洲精品影视在线观看| 中国女人久久久| 性娇小13――14欧美| 久久中文在线| 欧美日韩国产三级| 欧美日本中文字幕| 国产欧美精品日韩区二区麻豆天美| 国产精品每日更新| 久热国产精品| 国产一区91| 激情视频一区二区三区| 国产精品国产福利国产秒拍| 欧美三级精品| 国产日韩欧美二区| 亚洲资源在线观看| 亚洲尤物在线| 久久精品123| 麻豆91精品91久久久的内涵| 蜜桃av噜噜一区| 欧美精品xxxxbbbb| 国产精品毛片a∨一区二区三区| 国产亚洲精品美女| 亚洲福利在线视频| 小黄鸭精品aⅴ导航网站入口| 亚洲欧美精品在线| 久久综合色播五月| 亚洲精品视频免费| 久久久91精品国产| 欧美视频日韩视频| 亚洲国产精品一区二区www在线| 一区二区三区视频在线| 久久久综合精品| 亚洲国产精品一区| 午夜精品福利视频| 欧美视频一区| 最新69国产成人精品视频免费| 午夜精品久久99蜜桃的功能介绍| 欧美黄在线观看| 午夜精品久久久久久99热软件| 欧美日韩mv| 亚洲高清视频在线观看| 久久精品91| 日韩午夜黄色| 免费影视亚洲| 伊人男人综合视频网| 亚洲欧美在线一区二区| 亚洲国产精品一区二区www在线| 欧美一区日韩一区| 国产欧美在线观看一区| 久久久国产精品一区二区三区| 美女黄毛**国产精品啪啪| 国产精品久久久久久久久免费桃花| 亚洲国产日韩欧美| 欧美区一区二区三区| 亚洲精品一区二区网址| 欧美激情综合| 欧美精品成人一区二区在线观看 | 欧美日韩国产成人在线| 日韩网站在线观看| 亚洲激情在线观看视频免费| 欧美成人伊人久久综合网| 欧美人与性禽动交情品 | 亚洲视频自拍偷拍| 国产农村妇女精品一二区| 久久精品国产视频| 老司机午夜精品视频| 亚洲欧洲日本mm| 一本色道久久88综合亚洲精品ⅰ| 国产精品wwwwww| 欧美中在线观看| 久久久久久国产精品mv| 一区二区黄色| 亚洲欧美一区二区视频| 国产麻豆成人精品| 久久婷婷亚洲| 亚洲日本欧美| 久久er精品视频| 老司机免费视频一区二区| 亚洲精品国产无天堂网2021| 欧美在线观看一区二区三区| 欧美一区成人| 欧美日韩色婷婷| 一区二区三区日韩精品视频| 国产精品美女久久久| 亚洲欧美视频在线观看视频| 欧美亚洲免费高清在线观看| 午夜精品视频在线| 国产一区二区中文| 亚洲免费网站| 一区二区亚洲欧洲国产日韩| 制服丝袜亚洲播放| 亚洲黄色天堂| 国产精品久久久一区麻豆最新章节| 亚洲精品日韩在线观看| 亚洲国产美女| 国产精品久久久亚洲一区| 欧美一区二区日韩一区二区| 亚洲欧美日本在线| 欧美一区二区视频观看视频| 久久精品欧洲| 99热在这里有精品免费| 欧美在线看片| 亚洲少妇自拍| 91久久精品国产| 这里只有精品视频| 国产色爱av资源综合区| 美女久久网站| 欧美一区二区久久久| 欧美搞黄网站| 欧美亚洲在线播放| 亚洲日本激情| 影音先锋久久资源网| 亚洲第一天堂av| 国产精品男女猛烈高潮激情| 免费高清在线视频一区·| 99伊人成综合| 亚洲精品日韩在线观看| 亚洲欧洲日产国产综合网| 一区二区三区视频免费在线观看| 国内久久婷婷综合| 国产精品草莓在线免费观看| 欧美理论在线播放| 欧美精品在线一区| 欧美88av| 一区二区三区欧美日韩| 久久久久久久久久码影片| 久久久91精品国产一区二区三区| 欧美一级在线视频| 久久久夜夜夜| 亚洲成人自拍视频| 久久国产精品黑丝| 欧美激情亚洲国产| 亚洲日韩欧美视频一区| 99这里有精品| 久久精品亚洲一区| 亚洲女人天堂av| 欧美日韩国产综合视频在线| 国产欧美日韩一区二区三区在线观看 | 欧美成人一区二区在线| 国产精品v日韩精品| 国产精品一区二区你懂得| 国产一区欧美日韩| 亚洲欧美国产视频| 亚洲视频精品| 欧美激情综合亚洲一二区| 国产精品毛片a∨一区二区三区|国| 国产偷国产偷亚洲高清97cao| 欧美一区二区在线免费播放| 国产精品一区亚洲| 一本久道久久综合婷婷鲸鱼| 久久久综合网站| 午夜欧美大片免费观看| 国产一区成人| 久久久久国产成人精品亚洲午夜| 亚洲人成久久| 欧美成人69| 亚洲一区三区电影在线观看| 一区二区免费在线观看| 夜夜嗨av一区二区三区四区| 99国产精品99久久久久久粉嫩| 亚洲欧美卡通另类91av| 久久天堂成人| 国产精品成人在线| 国产精品系列在线| 在线播放亚洲一区| 一本色道久久99精品综合| 激情五月综合色婷婷一区二区| 国产欧美亚洲视频| 国产模特精品视频久久久久| 国产精品视频免费在线观看| 在线看片成人| 久久不射中文字幕| 一区二区欧美国产| 亚洲第一黄网| 午夜视频久久久久久| 亚洲成在人线av| 久久精品在线播放| 亚洲欧美综合| 欧美日韩性视频在线| 女女同性精品视频| 亚洲二区精品| 亚洲一区二区三区高清不卡| 1769国内精品视频在线播放| 久久国产精品色婷婷| 在线一区欧美|