游戏开发论坛

 找回密码
 立即注册
搜索
楼主: ACGFan

再论纯关键帧动画

[复制链接]

20

主题

465

帖子

472

积分

中级会员

Rank: 3Rank: 3

积分
472
QQ
发表于 2006-11-22 13:52:00 | 显示全部楼层

Re:再论纯关键帧动画

骨骼动画如果除去物体碰撞等一些特殊的功能,在渲染方面和关键帧就是一个典型的时间换空间问题。

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-11-24 14:09:00 | 显示全部楼层

Re:再论纯关键帧动画

感谢FlyMagic一次给了这么多代码(不过shader在那里呀)。FlyMagic的意思是对重复播放的动画设置缓存,缓存设置妥当后每桢调用,代价是CPU运算和IO。每顶点给1个POSITION。我的构思是绝没有每顶点的CPU运算,CPU只算每个批次的信息(比如变换矩阵),画的时候,用多流给多个顶点流,CPP:

  SetStreamSource(0...);
  SetStreamSource(1...);
  SetStreamSource(2...);

  VertexDecl decl;
  decl[0],POSITION[0] = short4n;
  decl[1],POSITION[1] = short4n;
  decl[2],POSITION[2] = short4n;
  decl();

  DrawPrimitive(...);
Shader(简化了):

float4x4 matViewProjection : ViewProjection;
float frame;

float3 morp(float3 s,float3 d,float3 c,float sd)
{
  float ss = 1.0 - sd;
  float3 res = lerp(s,d,sd);
  float3 off = res - c;
  if(any(off))
    return c + normalize(off) * lerp(length(s - c),length(d - c),sd );
  else
    return res;
}
struct vs_out
{
  float4 pos:POSITION0;
};

vs_out vs_main(   
   in float3 p[3] : POSITION)
{
  vs_out res;
  res.pos.w = 1.0;
       
  float3 center = (p[0] + p[1] + p[2]) / 3.0;
  int ind;
  float scale = modf(frame,ind);
  res.pos = float4(morp(p[ind],p[ind + 1],center,scale),1.0);
  return res;
}

回bracelet:每顶点,我决不会给哪怕一个矩阵,例子在前面。我给额外数据只是让轨迹平滑自然,而非使其精确。
我的原型:V0到Vn共n+1个相邻定点,两桢mesh,第一个起始点按插值scale生成V0',V1以V0'为圆心,scale为幅度画圆(可用近似算法,见我的shader),生成V1',以此类推到Vn'。因为不符合渲染管线,所以取一阶近似。

回smile636:本人欢迎一切形式的吹捧,多谢多谢。另外阁下之前说的优化完善的骨骼动画,能不能让我看看啊?

杂议:以前看过一贴,言道2D动画简单的设计使其还保持着甚强生命力,遂生廉价3D方案的念头,而有此文。

再重复一遍,Displacement Mapping出现后,增加了额外间接层次,顶点动画将能做很多以前只有骨骼动画才能做的事,顶点数量也会降低。所以顶点动画适用范围会变大。
大家都知道Displacement Mapping吧?

6

主题

307

帖子

309

积分

中级会员

Rank: 3Rank: 3

积分
309
发表于 2006-11-24 16:53:00 | 显示全部楼层

Re:再论纯关键帧动画

看你的解释似乎每一帧就是一个Mesh?,那量也不少啊

看你的顶点数据光position就是float3x3,不少啊,比普通的多了float3*2

而骨骼动画也就是float*2,每个float拆成4个byte,放4组MatrixIndex和Weight

8

主题

60

帖子

60

积分

注册会员

Rank: 2

积分
60
发表于 2006-11-24 17:54:00 | 显示全部楼层

Re:再论纯关键帧动画

顶点动画....完蛋....

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-11-28 22:44:00 | 显示全部楼层

Re:再论纯关键帧动画

顶点大小不太要紧吧,实在不行可以用short或half。
具体原因是前面说过的,可以不用担心细节增加使骨骼变太多。而且骨骼矩阵是要存放到临时寄存器的数,受此限制必须增加批次,一个批次一组矩阵。
这样一次可以画一个完整模型,而不是一个子部分。批次数量是减少了。

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-11-29 00:06:00 | 显示全部楼层

Re:再论纯关键帧动画

补充一下,刚才那个例子每顶点GPU是要从显存读3个POS,但不是每一桢动画都需要费3个mesh,每个关键桢只存一个mesh,但是渲染时送进多个桢,方便插值而已。毕竟有3点就可以画弧了。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-11-29 10:49:00 | 显示全部楼层

Re:再论纯关键帧动画

LZ 的想法是有些奇特,不过是基于一个假设为前提的,那就是 Displacement Mapping,但问题是 GPU 生成的 Vertex 能否在 VS 进行插值?又如何将实时生成的 Vertex 与 美术做好的每个关键祯数据对应(你代码中的那3个Pos)?
另外似乎LZ没有意识到 Vertex Animation 的数据量的恐怖 ,举个例子,目前游戏中一般人物模型顶点数量大概在 3k 左右,如果一个动作有60 祯,每个顶点如你所说有3个插值点,定点采用你说的 half类型,总计 = 60*3*2*3000 = 1080000 = 1.08M,假设每个人物有10 个这样的动画,那么就有 10.8M,假设有10个不同的人物,就有 108M,你想这些数据如果都进入 GPU 的后果是什么了吧。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-11-29 10:53:00 | 显示全部楼层

Re:再论纯关键帧动画

另外,骨骼动画数据仅和变换相关,而顶点动画却和顶点数据紧密相关,同一个骨骼动画数据可以应用到不同的模型上(当然前提是 skin 数据要一致),而顶点动画无法做到这一点。
我上一个项目两种动画方式都用到了,顶点动画只用于脸部的表情变化。

6

主题

95

帖子

103

积分

注册会员

Rank: 2

积分
103
 楼主| 发表于 2006-12-1 20:06:00 | 显示全部楼层

Re:再论纯关键帧动画

嗯,数据量问题我前面说了,我的插值方法本身就是为了减少数据量。一个三角,转180度也就三桢数据9个pos(一次全给),变形不大。所以60桢的动作应该不会出现。
至于对应,这个确实是一个问题,我现在能想到的办法也就是做出原型,其他人摆弄新造形而不添加顶点。因为对美工流程还不太了解,所以也无法找更进一步解决方法。
至于“GPU 生成的 Vertex 能否在 VS 进行插值?”,这个我欠考虑,多谢指出。我会尽快找出办法。
我的出发点是:动作足够复杂(考虑到柔体摆动等)的情况下,骨骼动画存储率还不如顶点动画。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-12-1 23:10:00 | 显示全部楼层

Re: Re:再论纯关键帧动画

ACGFan: Re:再论纯关键帧动画

嗯,数据量问题我前面说了,我的插值方法本身就是为了减少数据量。一个三角,转180度也就三桢数据9个pos(一...

SM4 支持从 GS Stream-Output 阶段直接进入 VS ,这样也许可以进行查值,但是我觉得对应的问题还是难以解决,除非硬件本身支持。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-26 02:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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