OpenGL紋理動畫,常見做法是將一個視頻離散成一系列靜態幀映像,逐個映像上傳到OpenGL產生紋理資源,保持四邊形的位置、紋理座標資料不變,動態綁定不同紋理從而實現播放視頻效果。這種做法通常不是最優的,可以從兩個地方改進:
1. 採用glTexSubImage2D函數,保持紋理Id不變情況下,動態替換紋理內容
2. 如果映像很小,可以將一系列映像打包到一張圖片中去,通過紋理UV索引不同子映像
本文通過UV座標直接操作映像實現動畫效果。
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 }};
在每幀繪製函數中:
1)保持紋理Id不變
2)修改紋理座標,
3)將位置,紋理資料傳給opengl繪製。
for (int i=0; i<g_vertexCount; i++){g_quadVertices[i].tv += g_arrowSpeed;}glBindTexture( GL_TEXTURE_2D, g_textureID );glInterleavedArrays( GL_T2F_V3F, 0, g_quadVertices );glDrawArrays( GL_QUADS, 0, g_vertexCount );
4. 效果
gif效果如下:
哦哦,csdn不支援gif播放了。
源碼下載:http://download.csdn.net/detail/dizuo/5720151
5. 參考
1. OpenGL經典教程:Nate Robin可視化教程
2. CodeSampler: http://www.codesampler.com/oglsrc.htm