歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenGL紋理UV動畫

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 }
};

Copyright © Linux教程網 All Rights Reserved