NeHe OpenGL第二十九課 Blt函式

2021-09-05 03:17:50 字數 2919 閱讀 3099

nehe opengl第二十九課:blt函式

blitter 函式:

類似於directdraw的blit函式,過時的技術,我們有實現了它。它非常的簡單,就是把一塊紋理貼到另一塊紋理上。

這篇文章是有andreas lffler所寫的,它寫了乙份原始的教程。過了幾天,rob fletcher發了封郵件給我,他重新改寫了所有的**,我在它的基礎上把glut的框架變換為win32的框架。

現在讓我們開始吧!

下面是乙個儲存影象資料的結構 

typedef struct texture_image

texture_image;

接下來定義了兩個指向這個結構的指標 

typedef texture_image *p_texture_image;       

p_texture_image t1;         // 指向儲存影象結構的指標

p_texture_image t2;         // 指向儲存影象結構的指標

下面的函式為w*h的影象分配記憶體 

p_texture_image allocatetexturebuffer( glint w, glint h, glint f)

else }

else

return ti;         // 返回指向影象資料的指標}

下面的函式釋放分配的記憶體 

// 釋放影象記憶體

void deallocatetexture( p_texture_image t )

free(t);         // 釋放影象結構記憶體}}

下面我們來讀取*.raw的檔案,這個函式有兩個引數,乙個為檔名,另乙個為儲存檔案的影象結構指標。 

// 讀取*.raw檔案,並把影象檔案上下翻轉一符合opengl的使用格式。

int readtexturedata ( char *filename, p_texture_image buffer)

*p = 255; p++;      // 把255儲存在alpha通道中}}

fclose(f);        // 關閉檔案}

如果出現錯誤,彈出乙個提示框 

else      

return done;         // 返回讀取的位元組數}

下面的**建立乙個2d紋理,和前面課程介紹的方法相同 

void buildtexture (p_texture_image tex)

現在到了blitter函式的地方了,他執行你把乙個影象的任意部分複製到另乙個影象的任意部分,並混合。

src為原影象

dst為目標影象

src_xstart,src_ystart為要複製的部分在原影象中的位置

src_width,src_height為要複製的部分的寬度和高度

dst_xstart,dst_ystart為複製到目標影象時的起始位置

上面的意思是把原影象中的(src_xstart,src_ystart)-(src_width,src_height)複製到目標影象中(dst_xstart,dst_ystart)-(src_width,src_height)

blend設定是否啟用混合,0為不啟用,1為啟用

alpha設定源影象中顏色在混合時所佔的百分比  

void blit( p_texture_image src, p_texture_image dst, int src_xstart, int src_ystart, int src_width, int src_height,

int dst_xstart, int dst_ystart, int blend, int alpha)

}d = d + (dst->width - (src_width + dst_xstart))*dst->format;  // 移動到下一行

s = s + (src->width - (src_width + src_xstart))*src->format;  }}

初始化**基本不變,我們使用新的函式,載入*.raw紋理。並把紋理t2的一部分blit到t1中混合,接著按常規的方法設定2d紋理。 

int initgl(glvoid)

t2 = allocatetexturebuffer( 256, 256, 4 );      // 為影象t2分配記憶體

if (readtexturedata("data/gl.raw",t2)==0)      // 讀取影象資料

把影象t2的(127,127)-(256,256)部分和影象t1的(64,64,196,196)部分混合 

// 把影象t2的(127,127)-(256,256)部分和影象t1的(64,64,196,196)部分混合

blit(t2,t1,127,127,128,128,64,64,1,127);     

下面的**和前面一樣,釋放分配的空間,建立紋理 

buildtexture (t1);        // 把t1影象載入為紋理

deallocatetexture( t1 );       // 釋放影象資料

deallocatetexture( t2 );      

glenable(gl_texture_2d);       // 使用2d紋理

glshademodel(gl_smooth);       // 使用光滑著色

glclearcolor(0.0f, 0.0f, 0.0f, 0.0f);     // 設定背景色為黑色

glcleardepth(1.0);        // 設定深度快取清楚值為1

glenable(gl_depth_test);       // 使用深度快取

gldepthfunc(gl_less);       // 設定深度測試函式

return true;}

下面的**繪製乙個盒子 

glvoid drawglscene(glvoid)

日本語 第二十九課

第二十九課 電気 消 次 文章 読 質問 答 車 止 菸草 意味 部長 言 書類 速 提出 誠 速 風呂 入 今宿題 母 先 入 何 読 立入禁止 読 入 意味 花 名前 知 花 加藤 森君 次 歌 戴 森 歌 李 戴 自分 年上 森 歌 失禮 加藤 場合 歌 戴 分 森 動詞的命令形 一類動詞 把...

第二十九課 邏輯「與」運算子

與 的異同點 相同點 二者都表示與操作,當且僅當運算子兩邊的運算元都為true時,其結果才為true,否則為false。不同點 在使用 進行運算時,不論左邊為true或者false,右邊的表示式都會進行運算。如果使用 進行運算時,當左邊為false時,右邊的表示式不會進行運算,因此 被稱作短路與,在...

第二十九天

字元陣列和字元指標不是一回事 1字元陣列由若干個元素組成,每個元素中放乙個字元,而字元指標變數中存放的是位址 字串第乙個字元的位址 決不是將字串放到字元指標變數中。2賦值方法不同,對字元陣列只能對各個元素賦值,不能用以下辦法對字元陣列賦值。char str 20 str miao 字元指標變數,可以...