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 字元指標變數,可以...