游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4397|回复: 13

有没有什么游戏是用shader来计算骨骼蒙皮的?

[复制链接]

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2009-5-19 18:54:00 | 显示全部楼层 |阅读模式
如果有, 能否给一个可以使用的这类shader代码?

看过clayman大师发的帖子, 但是这个帖子所发的shader代码教育目的远大于实际运用.

所以我想看看一个真正的 用shader来计算骨骼蒙皮 的代码

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-20 10:08:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

这是ms xna skinning sample中的代码,应该算是可以使用了
如果还要优化,那么可以把boneMatrix改为4*3(或者3*4)的矩阵

#define MaxBones 59
// Input parameters.
float4x4 View;
float4x4 Projection;
float4x4 Bones[MaxBones];

struct VS_INPUT
{
    float4 Position : POSITION0;
    float3 Normal : NORMAL0;
    float2 TexCoord : TEXCOORD0;
    float4 BoneIndices : BLENDINDICES0;
    float4 BoneWeights : BLENDWEIGHT0;
};

VS_OUTPUT VertexShader(VS_INPUT input)
{
    VS_OUTPUT output;

    // Blend between the weighted bone matrices.
    float4x4 skinTransform = 0;
    skinTransform += Bones[input.BoneIndices.x] * input.BoneWeights.x;
    skinTransform += Bones[input.BoneIndices.y] * input.BoneWeights.y;
    skinTransform += Bones[input.BoneIndices.z] * input.BoneWeights.z;
    skinTransform += Bones[input.BoneIndices.w] * input.BoneWeights.w;
   
    // Skin the vertex position.
    float4 position = mul(input.Position, skinTransform);
    output.Position = mul(mul(position, View), Projection);

    // Skin the vertex normal, then compute lighting.
    float3 normal = normalize(mul(input.Normal, skinTransform));
    //float3 normal = normalize(mul(skinTransform, input.Normal));
   
    float3 light1 = max(dot(normal, Light1Direction), 0) * Light1Color;
    float3 light2 = max(dot(normal, Light2Direction), 0) * Light2Color;

    output.Lighting = light1 + light2 + AmbientColor;
    output.TexCoord = input.TexCoord;
    return output;
}

float4 PixelShader(PS_INPUT input) : COLOR0
{
    float4 color = tex2D(Sampler, input.TexCoord);
    color.rgb *= input.Lighting;
    return color;
}

ps:我不是大师....-_-#

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-20 12:18:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

非常感谢!

想不到xna里有这么多好东西. 怎么dx sdk里没有?

xna是C#的吧? 我没学过C#...只学了C++

11

主题

650

帖子

651

积分

高级会员

Rank: 4

积分
651
发表于 2009-5-20 19:40:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

skinnedmesh里那个fx文件里有vs

11

主题

190

帖子

255

积分

中级会员

Rank: 3Rank: 3

积分
255
发表于 2009-5-21 09:05:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

我估计现在新制作的游戏没有不用Shader计算蒙皮的


-----------------
欢迎光临我的博客 http://www.thecodeway.com

0

主题

769

帖子

1052

积分

金牌会员

Rank: 6Rank: 6

积分
1052
发表于 2009-5-21 09:21:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

用SHADER计算速度确实快了
可是,计算结果要咋样传回程序再处理?

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2009-5-21 09:57:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

基本不用固定管线了

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2009-5-21 12:05:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

不用固定管线, 所以根本不需要传回程序处理, 在shader里直接画出来.

13

主题

113

帖子

113

积分

注册会员

Rank: 2

积分
113
发表于 2009-5-21 12:36:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

shader里面不能动态的指定MaxBones,所以必须预先规定好最大骨骼数.不知道最大的数量在shader中有没有限制,SM2.0标准

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2009-5-21 15:46:00 | 显示全部楼层

Re:有没有什么游戏是用shader来计算骨骼蒙皮的?

dx9c级别的显卡只有256个constant register
所以最多渲染70个左右的骨骼
再多就要分成2个batch了
70个骨头的动物,一般还是够用了吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 04:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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