OpenGL紋理動畫,常見做法是將一個視頻離散成一系列靜態幀圖像,逐個圖像上傳到OpenGL生成紋理資源,保持四邊形的位置、紋理坐標數據不變,動態綁定不同紋理從而實現播放視頻效果。這種做法通常不是最優的,可以從兩個地方改進:
1. 采用glTexSubImage2D函數,保持紋理Id不變情況下,動態替換紋理內容
2. 如果圖像很小,可以將一系列圖像打包到一張圖片中去,通過紋理UV索引不同子圖像
本文通過UV坐標直接操作圖像實現動畫效果。
源碼下載:
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2014年資料/3月/25日/OpenGL紋理UV動畫
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
1. 紋理坐標空間
如下圖為Nate Robin教程中的texture截圖:
紋理空間視圖,s軸為U坐標,t軸為V坐標。 u=1,v=1切好取到一張完整的圖片,u=2, v=2如下圖,取了四張完整的圖片作為貼圖:
OpenGL中有紋理矩陣堆棧,理論上可以通過矩陣操作紋理,但是沒有實例。基於上面的嘗試,我嘗試通過動態修改紋理坐標實現一個精靈動畫。
2. 貼圖准備
圖片是TGA格式的,黑色部分alpha通道值為0。 開啟alpha融合以後,黑色部分最終顯示為背景色,只有白色箭頭可見。
通過控制紋理V坐標實現箭頭流動動畫。
3. 程序實現
初始化 指定紋理坐標:
struct Vertex
{
float tu, tv;
float x, y, z;
};
int g_vertexCount = 4;
float g_quadWid = 0.2f;
float g_quadHgh = 2.0f;
float g_textureU = 1.0f;
float g_textureV = 2.0f;
float g_arrowSpeed = 0.01f;
Vertex g_quadVertices[] =
{
{ 0.0f,0.0f, -g_quadWid/2,-g_quadHgh/2, 0.0f },
{ g_textureU,0.0f, g_quadWid/2,-g_quadHgh/2, 0.0f },
{ g_textureU,g_textureV, g_quadWid/2, g_quadHgh/2, 0.0f },
{ 0.0f,g_textureV, -g_quadWid/2, g_quadHgh/2, 0.0f }
};