|
|

楼主 |
发表于 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吧? |
|