?? opengl+
字號:
OpenGL紋理帖圖簡介2008/05/07 16:47OpenGL可以生成各種物體,并可以賦予材質和對物體進行光照。但物體表面過于光滑和單調,看起來反而不真實。這是因為現實世界中的物體表面往往有各種紋理,即表面細節。紋理貼圖技術也叫紋理映射技術。紋理分兩種:顏色紋理,通過顏色色彩或明暗的變化表現出來的表面細節;由于不規則的細小凹凸造成的紋理,如桔子的皺紋和未磨光的凹痕等.
生成紋理的一般方法是在一個平面區域(紋理空間)上預先定義紋理圖案,然后建立物體表面空間和
紋理圖案坐標之間的映射關系。當物體表面的可見的點確定后,就可以根據紋理空間的對應點的值紋理圖案,附到物體的表面上。
紋理的定義有連續法和離散法兩種:連續法把紋理定義為一個離散函數,函數的定義域就是紋理空間。
離散法把紋理函數定義在一個二維數組中,代表紋理空間中行間隔和列間隔固定的一組網格點上的紋理值。網格點之間的其他點的紋理值通過插值獲得。通過紋理空間與物體空間的坐標變化,把紋理貼圖道物體表面。
紋理貼圖的類型主要有:材質貼圖、Mip貼圖、凹凸貼圖、動態材質貼圖等。材質貼圖將一張已有的
圖像直接貼到物體的表面;Mip貼圖依據不同的精度要求,使用不同版本的材質圖樣進行貼圖;凹凸貼圖將深度的變化保存在一張貼圖中,然后將對三維物體進行混合貼圖處理,最后生成具有凹凸感的貼圖效果。
新的紋理貼圖技術包括:雙線性過濾技術,可以解決紋理縮放時的塊狀圖;多重貼圖技術,可以解決景
深鋸齒問題。景深鋸齒現象是當一個物體遠離視點時,貼在越來越小的物體上的圖案也會被逐漸壓縮,以致最后產生視覺余象,這些視覺余象會在動畫中引起閃爍現象;三線性過濾技術,解決物體向遠處移動且進行圖像切換時產生的閃爍現象。
執行紋理貼圖的步驟如下:定義紋理貼圖;控制紋理;說明紋理貼圖方式;定義紋理坐標。定義二維
紋理貼圖的函數原形
void glTexImage2D(GLeum target,GLint level,GLint components,GLsizei width,
GLsizei height,GLint border,GLenum format,GLenum type,
const GLvoid *pixels);
target參數必須是GL_TEXTURE_2D;
level參數表示紋理圖像紋理分辨率的級別,當只有一種分辨率時,level值為0;
components可以為1,2,3,4,1代表只選擇紋理圖像的紅色分量,2代表只選擇紋理圖像的紅色和Alpha分量,3代表同時選擇紋理圖像的紅色、綠色、藍色分量,4代表同時選擇紋理圖像的紅色、綠色、藍色和Alpha分量; width和height參量定義紋理圖像的寬度和長度,border參數說明紋理邊界的寬度;
format參數說明紋理圖像數據的格式,pixels說明紋理圖像的像素數據的存儲地址;
定義一維紋理貼圖的函數原形為:
void glTexImage1D(GLenum target,GLint level,GLint components,GLsizei width,
GLsizei height,GLint border,GLenum format,GLenum typeOpenGL)
用glTexParameter()解決以下問題:如何將紋理圖像的紋理對應到屏幕上的像素;當紋理圖像較大或較小時,怎樣通過紋理貼圖實現紋理縮限和紋理重復。
void glTexParameter(GLenum target,GLenum pname,GLfloat param);
target 的參數可以為GL_TEXTURE_1D和GL_TEXTURE_2D;
pname 的參數可以為
常 量
含 義
GL_TEXTURE_MIN_FILTER
一個像素對應多個紋素
GL_TEXTURE_MAG_FILTER
多個像素對應一個紋素
GL_TEXTURE_WRAP_S
設置紋理在s方向上的被控行為
GL_TEXTURE_WRAP_T
設置紋理在t方向上的被控行為
GL_TEXTURE_BORDER_COLOR
設置邊界顏色
在進行紋理貼圖時,紋理貼圖可以直接貼到物體上從而覆蓋物體已有的顏色,也可以和物體原有的顏色進行融合。融合是一種重要的圖像處理技術,主要用于透明效果的處理。
void glTexEnvf(GLenum target,GLenum pname,GLfloat param);
target的參數必須是GL_TEXTURE_ENV;
pname的參數可以為GL_TEXTURE_ENV_MODE或GL_TEXTURE_ENV_COLOR
param可以為GL_MODULATE、GL_DECAL、GL_BLEND
紋理坐標控制紋理圖像中的紋理怎樣映射到物體,可以為1,2,3,4維的,通常用齊次坐標表示為
(s,t,r,q);OpenGL中定義紋理坐標的函數為glTexCoord(),該函數有多種形式,如
glTexCoord2f(0.0f,0.0f);
位圖分為設備相關位圖和設備無關位圖。設備相關位圖依賴于顯示設備的位模式;設備無關位圖描述了
圖形的真實外形,而不是由某種特定顯示設備所顯示圖像的內部表示
BITMAPFILEHEADER結構
typedef struct tagBITMAPFILEHEADER
{
WORD bfType;//說明文件是一個位圖文件
WORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;//位圖文件中的字節偏移
}BITMAPFILEHEADER; BITMAPINFOHEADER結構
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //表示結構的大小
DWORD biWidth; //表示像素為單位的位圖寬度
DWORD biHeight; //表示像素為單位的位圖高度
WORD biPlaes; //表示目標設備的位平面數
WORD biBitCount; //表示位圖的每個像素的位數
DWORD biCompression; //表示位圖的被壓縮類型
DWORD biSizeImage; //表示被壓縮位圖的字節數
DWORD biXPelsPerMeter; //表示位圖的水平分辨率
DWORD biYPelsPerMeter; //表示位圖的垂直分辨率
DWORD biClrUsed; //指定位圖實際使用的顏色數
DWORD biClrImportant; //位圖比較重要的顏色索引的個數
}BITMAPINFOHEADER;
RGBQUAD結構
typedef struct tagRGBQUAD
{
BYTE rgbBLUE; //藍色分量
BYTE rgbGREEN; //綠色分量
BYTE rgbRED; //紅色分量
BYTE rgbReserved; //值為0
}RGBQUAD;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -