游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2510|回复: 3

3D中的纹理动画技术

[复制链接]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-10-17 20:30:00 | 显示全部楼层 |阅读模式
原创:hdm2968。请勿转载。
这是关于3D中billboard的纹理帧动画,主要思想是来源自2D的动画思想。
在一张纹理上有x列和y行,分成x*y个单元,它们的大小是一样的,起初有第一个单元起,每次更新向左移动一个单元;当到结尾时就从下一行的第一个单元在开始,之后到右下角最后一个时又再从左上角第一个开始。于是形成动画。
首先是有一个billboard类,其实简单的就是四边形就行了,它的动画系统必须有纹理、纹理的纵行数、纹理的横行数和当前的单元号码。当然“纹理的纵行数、纹理的横行数”是视纹理而变的。而纹理是怎样的?可以参考附件,很多2D动画都是使用这类图片,但与3D不同的是,2D的背景色是(255,0,255),而3D的背景色应该是alpha通道,所以最后使用.tga文件。
下面看看简单的动画类:
class AnimBillBoard
{
公布版;
纹理;
纹理的纵行数;//row
纹理的横行数;//line
当前的单元号码;//pointer
初始化函数();
更新动画函数();
渲染函数();
...
};
初始化函数()作为载入纹理和得到纵行数和横行数。更新动画函数()不需要经常执行,因为人的视觉保留没法跟上每秒数百次的更新,这就需要时间协调了。渲染函数()就不用我说了。
现在要详细说一下“更新动画函数()”。首先是决定pointer,初始为0,每次加1,如果等于或大于row*line,则重置为0。至于纹理坐标的u、v的确定,u就是rowr除pointer的余再乘上每个单元的宽度,v就是row除pointer的商的整数部分再乘上每个单元的高度。知道uv但还不够,因为billboard是两个点描述的,左上角的纹理坐标就是uv,右下角自然是(u,v)+(每个单元宽度,每个单元高度)。
另外,纹理坐标的改变,我只知道lock和vertex shader,听说还有另一种方法Vertex Declaration,但这个的做法没有试过。
E-mail:hdm2968@163.com
对于Vertex Declaration,希望有人此教。
以上那免有错与不足,请大家指出。
sf_20051017202956.jpg

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2005-10-19 20:37:00 | 显示全部楼层

Re:3D中的纹理动画技术

个人还是比较喜欢用一张张的动画纹理。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-10-20 18:56:00 | 显示全部楼层

Re:3D中的纹理动画技术

但一张张,你岂不是要耗很多内存?

14

主题

283

帖子

293

积分

中级会员

Rank: 3Rank: 3

积分
293
QQ
发表于 2005-10-25 01:17:00 | 显示全部楼层

Re:3D中的纹理动画技术

楼主请教的方法应该是顶点多流吧.也就是顶点的纹理坐标来自另外个缓冲区,这样可以通过
SetStreamSource指定起始字节来获得指定的纹理坐标值.要自己声明个顶点结构(Vertex Declaration),指定纹理信息来自第2个流.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 08:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表