青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

麒麟子

~~

導航

<2013年3月>
242526272812
3456789
10111213141516
17181920212223
24252627282930
31123456

統(tǒng)計

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

Friends

WebSites

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

irrlicht引擎:硬件蒙皮骨骼動畫

這個東西很順利,僅用了半小時就找到了方法,最應該感謝的還是Super TuxKart(簡稱STK,下面就都用這三字母了). 如果不明白STK,同時又對它感興趣的童鞋,可以訪問這里

http://supertuxkart.sourceforge.net/

由于墻的原因,需要各位搭梯子。

 

上周末,在弄換裝的時候,發(fā)現irrlicht引擎本身是不支持硬件蒙皮的,多少令人有些失望。 心里就一直尋思著怎么擴展一下,將它弄出來。

值得說明的是STK對irrlicht引擎的用法是很簡單的,基本上可以說是裸用,并未在irrlicht接口上做修改。 而是對外進行了一些必要的擴展。

當然,STK也對外開放了一個irrlicht.dll,說是修改了其中的BUG。 但直接使用irrlicht是可以的。

 

廢話不多說,來說說如何不修改irrlicht一行代碼,通過外部擴展來實現硬件骨骼動畫吧

 

首先,能夠使我們不修改irrlicht代碼的原因,是因為ISkinnedMesh提供了一個setHardwareSkinning接口,默認為false.

雖然這個接口的說明是"(This feature is not implemented in irrlicht yet)”,但并不代表,設置與不設置無差別。

查看代碼可以發(fā)現,當你設置了這個為true以后,irrlicht就完全不管你的動畫了。 意思就是,要是你非要讓我干我不干不了的事,那就只有您另請高明了。

irrlicht連CPU計算都不會參與。 這正好讓我們有機可乘,完全用GPU接管。

 

而要讓一個頂點參與骨骼計算,那骨骼索引則是少不了的。所以,我們需要想辦法讓頂點數據能夠將骨骼索引代入SHADER中。

在STK中用了一種巧妙的方法, 就是使用了頂點的顏色數據, 雖然這樣一來,頂點顏色就用不了了。 但在模型渲染時,頂點顏色很少被使用到的。 也就是說,頂點顏色在STK的動畫模型中,被用作了骨骼索引。

初始化骨骼索引的方法很簡單,用下面的代碼遍歷即可。

設:我們有一個骨骼動畫模型是 ISkinnedMesh* pSkinnedMesh = …

那么:初始化代碼如下

for(u32 i = 0;i < pSkinnedMesh ->getMeshBuffers().size();++i)
{
    for(u32 g = 0;g < pSkinnedMesh ->getMeshBuffers()[i]->getVertexCount();++g)
    {
        pSkinnedMesh ->getMeshBuffers()[i]->getVertex(g)->Color = video::SColor(0,0,0,0);
    }
}

//初始化完畢以后,就是需要真正的索引賦值了,通過以下代碼可以完成

const core::array<scene::ISkinnedMesh::SJoint*>& joints = pSkinnedMesh ->getAllJoints();
for(u32 i = 0;i < joints.size();++i)
{
    const core::array<scene::ISkinnedMesh::SWeight>&    weights = joints[i]->Weights;
    for(u32 j = 0;j < weights.size();++j)
    {
        int buffId = weights[j].buffer_id;

        int vertexId = pSkinedMesh->getAllJoints()[i]->Weights[j].vertex_id;
        video::SColor* vColor = &pSkinedMesh->getMeshBuffers()[buffId]->getVertex(vertexId)->Color;

        if(vColor->getRed() == 0)
            vColor->setRed(i + 1);
        else if(vColor->getGreen() == 0)
            vColor->setGreen(i + 1);
        else if(vColor->getBlue() == 0)
            vColor->setBlue(i + 1);
        else if(vColor->getAlpha() == 0)
            vColor->setAlpha(i + 1);
    }
}

 

//經過以上兩個步驟,頂點數據改造完成。 值得注意的是, 在這里, 索引 0 是被認為是無效的

 

然后,我們來創(chuàng)建一個SHADER作為渲染。

假設 我們將這個pSkinnedMesh綁定了到了一個IAnimatedSceneNode* node 上。

那,我們?yōu)檫@個結點創(chuàng)建一個材質 在創(chuàng)建材質前,我們需要準備一個SHADER回調。 SHADER回調就像下面一樣就可以了。

class HWSkinCallBack:public video::IShaderConstantSetCallBack
{
    scene::IAnimatedMeshSceneNode* m_pNode;
public:
    HWSkinCallBack(scene::IAnimatedMeshSceneNode* node):m_pNode(node)
    {

    }
    virtual void OnSetConstants(video::IMaterialRendererServices* services,
        s32 userData)
    {
        scene::ISkinnedMesh* mesh = (scene::ISkinnedMesh*)m_pNode->getMesh();
        f32 joints_data[55 * 16];
        int copyIncrement = 0;

        const core::array<scene::ISkinnedMesh::SJoint*> joints = mesh->getAllJoints();
        for(u32 i = 0;i < joints.size();++i)
        {
            core::matrix4 joint_vertex_pull(core::matrix4::EM4CONST_NOTHING);
            joint_vertex_pull.setbyproduct(joints[i]->GlobalAnimatedMatrix, joints[i]->GlobalInversedMatrix);

            f32* pointer = joints_data + copyIncrement;
            for(int i = 0;i < 16;++i)
                *pointer++ = joint_vertex_pull[i];

            copyIncrement += 16;
        }

        services->setVertexShaderConstant("JointTransform", joints_data, mesh->getAllJoints().size() * 16);
    }
};

 

好了,現在我們來創(chuàng)建一個材質

s32 hwskm = gpu->addHighLevelShaderMaterialFromFiles(
        "../../skinning.vert","main",video::EVST_VS_2_0,
        "","main",video::EPST_PS_2_0,&hwc,video::EMT_SOLID);

//用新創(chuàng)建出來的材質賦值給這個結點

node->setMaterialType((video::E_MATERIAL_TYPE)hwskm );

 

//到此,設置完畢。

//最后,就是skinning.vert本身的內容了。 貼出來即可,沒有太多技巧,就是一個普通的蒙皮。

// skinning.vert

#define MAX_JOINT_NUM 36
#define MAX_LIGHT_NUM 8

uniform mat4 JointTransform[MAX_JOINT_NUM];

void main()
{
    int index;
    vec4 ecPos;
    vec3 normal;
    vec3 light_dir;
    float n_dot_l;
    float dist;

    mat4 ModelTransform = gl_ModelViewProjectionMatrix;
    index = int(gl_Color.r * 255.99);
    mat4 vertTran = JointTransform[index - 1];
    index = int(gl_Color.g * 255.99);
    if(index > 0)
        vertTran += JointTransform[index - 1];

    index = int(gl_Color.b * 255.99);
    if(index > 0)
        vertTran += JointTransform[index - 1];
    index = int(gl_Color.a * 255.99);
    if(index > 0)
        vertTran += JointTransform[index - 1];
    ecPos = gl_ModelViewMatrix * vertTran * gl_Vertex;
    normal = normalize(gl_NormalMatrix * mat3(vertTran) * gl_Normal);
    gl_FrontColor = vec4(0,0,0,0);
    for(int i = 0;i < MAX_LIGHT_NUM;i++)
    {
        light_dir = vec3(gl_LightSource[i].position-ecPos);
        n_dot_l = max(dot(normal, normalize(light_dir)), 0.0);
        dist = length(light_dir);
        n_dot_l *= 1.0 / (gl_LightSource[0].constantAttenuation + gl_LightSource[0].linearAttenuation * dist);
        gl_FrontColor += gl_LightSource[i].diffuse * n_dot_l;
    }
    gl_FrontColor = clamp(gl_FrontColor,0.3,1.0);

    ModelTransform *= vertTran;
    gl_Position = ModelTransform * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_TexCoord[1] = gl_MultiTexCoord1;
    /*
    // Reflections.
    vec3 r = reflect( ecPos.xyz , normal );
    float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + (r.z+1.0)*(r.z+1.0) );
    gl_TexCoord[1].s = r.x/m + 0.5;
    gl_TexCoord[1].t = r.y/m + 0.5;
    */
}

 

 

//注:這是GLSL 2.0, 在用IRR做測試的時候,要選GL驅動方式。

 

還是上個圖吧,不上圖感覺沒有真像。 雖然圖看不出來什么動作

image

為了說明它真的在動,不得不上第二張。

 

image 

 

在此,十分感謝Super Tux Kart. 提供了一個學習和擴展irrlicht的榜樣.

posted on 2013-03-26 00:08 麒麟子 閱讀(3363) 評論(0)  編輯 收藏 引用 所屬分類: Game and EngineIrrlicht

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产人久久人人人人爽| 国产精品99久久久久久www| 在线日韩电影| 在线观看一区欧美| 亚洲激情在线| 日韩午夜剧场| 亚洲一区久久| 午夜在线精品偷拍| 久久免费少妇高潮久久精品99| 久久久久欧美精品| 欧美福利影院| 一区二区三区.www| 欧美在线观看日本一区| 久久精品99久久香蕉国产色戒| 久久尤物电影视频在线观看| 欧美暴力喷水在线| 欧美午夜宅男影院| 国产视频综合在线| 亚洲精品美女91| 亚洲欧美中文日韩在线| 另类av导航| 日韩香蕉视频| 久久久福利视频| 欧美天天综合网| 伊人久久婷婷色综合98网| 亚洲精品国产精品乱码不99| 亚洲欧美综合国产精品一区| 欧美成人伊人久久综合网| 国产精品99久久久久久久久久久久 | 欧美激情一区二区三区在线视频| 亚洲三级观看| 亚洲欧美激情四射在线日| 另类激情亚洲| 国产视频在线观看一区二区三区| 日韩亚洲精品电影| 看欧美日韩国产| 在线一区二区日韩| 欧美激情片在线观看| 黄色成人片子| 欧美一级视频免费在线观看| 亚洲欧洲精品一区二区三区不卡| 欧美在线视频在线播放完整版免费观看| 欧美日韩国产天堂| 亚洲黄色免费| 狂野欧美激情性xxxx欧美| 亚洲一区二区精品在线| 欧美日韩国产区一| 夜夜嗨av一区二区三区四季av| 欧美电影免费| 欧美日韩中文| 国产欧美日韩综合精品二区| 一区二区欧美在线观看| 亚洲国产精品一区二区尤物区| 欧美在线观看视频| 国产一区二区三区视频在线观看| 亚洲欧美另类中文字幕| 99av国产精品欲麻豆| 欧美精品在线播放| 99re国产精品| 亚洲美女电影在线| 欧美精品二区三区四区免费看视频| 亚洲大黄网站| 欧美成人免费大片| 久久人人爽国产| 亚洲激情黄色| 亚洲丁香婷深爱综合| 免费看成人av| 亚洲第一成人在线| 亚洲第一页自拍| 欧美高清视频www夜色资源网| 亚洲欧洲在线播放| 亚洲人成久久| 国产精品久久久久久久久久ktv| 在线性视频日韩欧美| 亚洲久久一区二区| 国产精品三区www17con| 久久久免费精品视频| 老司机免费视频一区二区三区| 亚洲国产日韩一区二区| 91久久极品少妇xxxxⅹ软件| 国产精品成人一区二区| 久久久www成人免费无遮挡大片 | 亚洲视屏一区| 亚洲视频欧美视频| 国产亚洲午夜高清国产拍精品| 久久精品亚洲| 免费视频一区| 一区二区三区欧美| 亚洲精品一区二| 欧美视频一区二区三区在线观看| 午夜精品美女自拍福到在线| 亚洲一级免费视频| 亚洲成在人线av| 中国成人在线视频| 激情久久五月| 亚洲视频导航| 尤物99国产成人精品视频| 亚洲精选一区| 黄色综合网站| 亚洲日本成人网| 国产一区二区日韩精品| 亚洲国产精品热久久| 欧美新色视频| 欧美大片在线观看| 国产精品一区二区三区四区| 男人插女人欧美| 欧美午夜免费| 亚洲电影视频在线| 国产日韩一区二区三区在线| 揄拍成人国产精品视频| 亚洲综合不卡| 欧美不卡激情三级在线观看| 欧美中文字幕视频在线观看| 欧美激情一区二区久久久| 久久久精品网| 欧美视频日韩视频| 亚洲国产成人精品视频| 国外视频精品毛片| 日韩午夜激情av| 91久久夜色精品国产网站| 亚洲欧美一区二区三区极速播放| 一区二区日韩| 欧美激情精品久久久久久大尺度| 午夜精品影院在线观看| 免费成人高清视频| 免费观看国产成人| 狠狠色伊人亚洲综合网站色| 欧美在线高清视频| 久久久久国产一区二区| 国产欧美日韩精品一区| 亚洲视频在线二区| 亚洲欧美日韩视频一区| 国产精品v亚洲精品v日韩精品| 亚洲精品免费观看| 亚洲蜜桃精久久久久久久| 久久www免费人成看片高清| 国产精品美女久久久浪潮软件| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美精品在线观看播放| 你懂的国产精品永久在线| 欧美中文日韩| 久久九九久久九九| 国产亚洲精品7777| 欧美在线一级视频| 久久综合给合久久狠狠狠97色69| 国产香蕉久久精品综合网| 欧美亚洲综合在线| 久久综合九色综合欧美就去吻| 国内揄拍国内精品少妇国语| 欧美一级免费视频| 久久久蜜桃精品| 一区免费观看视频| 美女主播视频一区| 亚洲精品视频中文字幕| 夜夜爽av福利精品导航| 欧美日韩在线观看一区二区| 亚洲精品在线一区二区| 亚洲综合社区| 国产一区二区三区久久悠悠色av | 欧美高清视频在线| 欧美二区在线| 一本到高清视频免费精品| 欧美日韩四区| 午夜精品影院在线观看| 亚洲欧美日韩精品一区二区| 国产亚洲一本大道中文在线| 久久免费黄色| 亚洲美女精品一区| 亚洲一区www| 玖玖国产精品视频| 99一区二区| 久久精品日韩| 亚洲三级免费电影| 久久久久国产一区二区三区| 亚洲欧洲日本一区二区三区| 欧美日本一道本| 午夜在线电影亚洲一区| 欧美高清视频免费观看| 亚洲综合国产| 亚洲国产精品成人| 国产精品亚发布| 欧美.com| 午夜精品一区二区三区在线| 亚洲国产天堂久久综合网| 羞羞色国产精品| 亚洲精品一区二区在线| 国产精品永久免费| 欧美美女喷水视频| 久久精品国内一区二区三区| 日韩午夜精品| 欧美激情一区二区三区蜜桃视频| 性欧美长视频| 亚洲最新视频在线| 精品91在线| 国产日韩欧美视频| 国产精品成人一区二区艾草| 欧美成人免费视频| 久久综合99re88久久爱| 久久爱另类一区二区小说| 亚洲无毛电影|