OpenGL: 纹理UV动画
2014-02-25 17:12
661 查看
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. 程序实现初始化 指定纹理坐标:
在每帧绘制函数中:1)保持纹理Id不变2)修改纹理坐标,3)将位置,纹理数据传给opengl绘制。
哦哦,csdn不支持gif播放了。源码下载:http://download.csdn.net/detail/dizuo/57201515. 参考1. OpenGL经典教程:Nate Robin可视化教程2. CodeSampler: http://www.codesampler.com/oglsrc.htm
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/57201515. 参考1. OpenGL经典教程:Nate Robin可视化教程2. CodeSampler: http://www.codesampler.com/oglsrc.htm
相关文章推荐
- linux grep命令
- 【贪心】【POJ-3637】Shopaholic
- Shell学习(5)——shell数组
- tomcat中的程序部署到weblogic10.3.6
- OpenGL: 实现立体显示
- 去年12月29日,红旗Linux员工在网上发出请愿书“风雨飘摇,中科红旗路在啊何方?”,又打出横幅”软件所还我核高基专项款,大股东无视职工死活“,到工信部大门口集体请愿、讨薪,闹得很不安宁。
- Linux系统手动安装rpm包依赖关系分析(以Kernel升级为例)
- 在嵌入式Linux系统中实现USB存储设备的自动挂载
- shell脚本学习笔记一
- centos6.4下编译apue.h(第二版)
- 在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)
- linux 链接脚本
- Linux文件系统之hard link&symbol link
- OpenGL: 绘制按钮
- centos初装后并没有带上rz sz的程序。需要安装: yum install lrzsz
- 关于MVC中DropDownListFor的一个bug
- CS/BS架构区别
- windows下eclipse远程连接linux上的hadoop集群
- Linux crontab 任务调度的使用
- opencv中测量运行时间的函数