OpenGL紋理UV動畫

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.