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

麒麟子

~~

導航

<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>
            亚洲免费成人| 亚洲高清不卡一区| 午夜精品美女久久久久av福利| 亚洲高清一区二| 免费91麻豆精品国产自产在线观看| 狠狠干成人综合网| 欧美激情一区二区三区| 欧美国产视频一区二区| 99在线热播精品免费99热| 91久久夜色精品国产网站| 欧美日韩精品国产| 午夜精品久久久久久久99热浪潮| 欧美一区1区三区3区公司| 尤物99国产成人精品视频| 亚洲黄色性网站| 国产精品久久亚洲7777| 久久久久久久久久久久久9999| 久久噜噜噜精品国产亚洲综合| 亚洲每日更新| 先锋影院在线亚洲| 亚洲裸体俱乐部裸体舞表演av| 99亚洲一区二区| 一区二区亚洲精品| 一本色道久久综合亚洲91| 国产亚洲激情在线| 最新亚洲电影| 激情成人av在线| 99这里只有精品| 亚洲国产精品嫩草影院| 亚洲少妇最新在线视频| 亚洲电影av在线| 亚洲欧美日韩区| 夜夜嗨av色综合久久久综合网| 欧美一级淫片播放口| 一区二区三区福利| 久久夜色精品国产欧美乱极品| 亚洲在线网站| 亚洲国产精品一区| 国产手机视频精品| 9久re热视频在线精品| 亚洲国产成人精品久久久国产成人一区 | 久久精品人人做人人爽| 夜夜精品视频一区二区| 久久久999成人| 性伦欧美刺激片在线观看| 欧美国产一区在线| 欧美不卡福利| 在线成人亚洲| 久久精品日韩欧美| 久久国产黑丝| 国产视频一区在线| 亚洲欧美美女| 亚洲欧美国产制服动漫| 欧美剧在线观看| 91久久精品久久国产性色也91 | 狼人天天伊人久久| 久久免费午夜影院| 国内精品久久久久国产盗摄免费观看完整版| 亚洲人成亚洲人成在线观看| 在线观看的日韩av| 久久久国产亚洲精品| 久久久不卡网国产精品一区| 国产精品视频免费在线观看| 夜夜嗨av色综合久久久综合网 | 国产一区亚洲| 欧美一区成人| 蜜臀av一级做a爰片久久| 韩国在线一区| 麻豆精品国产91久久久久久| 欧美激情一区二区三区蜜桃视频 | 欧美久久精品午夜青青大伊人| 亚洲国产精品一区二区www| 亚洲开发第一视频在线播放| 欧美sm重口味系列视频在线观看| 欧美韩日一区二区| 亚洲乱码国产乱码精品精可以看 | 午夜精品福利在线| 国产偷自视频区视频一区二区| 欧美一二区视频| 欧美va天堂在线| 日韩一级免费观看| 国产精品hd| 香蕉成人伊视频在线观看 | 性久久久久久久久| 国产原创一区二区| 欧美成人免费在线视频| 亚洲精品欧美激情| 亚洲欧美日韩中文在线制服| 国产小视频国产精品| 美女被久久久| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲精品在线免费观看视频| 欧美黄色aa电影| 亚洲一区在线免费| 免费人成网站在线观看欧美高清| 亚洲美女在线看| 国产女主播一区| 嫩模写真一区二区三区三州| 一区二区三区四区精品| 久久青青草综合| 一本一本大道香蕉久在线精品| 国产区二精品视| 欧美精品18+| 久久精品视频在线| 99视频一区二区三区| 久久综合九色九九| 亚洲综合电影一区二区三区| 黄网动漫久久久| 国产精品美女一区二区在线观看 | 亚洲欧美国产视频| 91久久精品日日躁夜夜躁欧美| 欧美一区二区精品| 99综合在线| 在线观看视频亚洲| 国产日韩精品在线播放| 欧美伦理a级免费电影| 久久久999国产| 亚洲男人影院| 一本不卡影院| 亚洲精品中文字幕有码专区| 噜噜噜躁狠狠躁狠狠精品视频| 午夜精品亚洲一区二区三区嫩草| 亚洲黄一区二区| 影音先锋日韩有码| 国产三级欧美三级日产三级99| 欧美日韩在线免费观看| 欧美国产精品人人做人人爱| 久久九九精品| 欧美在线视频a| 欧美亚洲视频| 亚洲在线观看视频| 亚洲天堂av在线免费观看| 亚洲精品一区二区三区不| 亚洲国产高清在线观看视频| 另类国产ts人妖高潮视频| 久久久.com| 久久久亚洲欧洲日产国码αv| 亚洲一区二区三区在线看| 一区二区三区国产| 一区二区激情视频| 一本久道综合久久精品| 99精品国产热久久91蜜凸| 亚洲免费观看| 亚洲美女在线视频| 亚洲最新在线| 亚洲在线一区二区三区| 亚洲免费视频一区二区| 亚洲综合首页| 先锋影音国产精品| 久久久久久久久久码影片| 久久久夜色精品亚洲| 噜噜爱69成人精品| 亚洲高清在线观看| 亚洲激情成人| 亚洲天堂av在线免费观看| 亚洲欧美清纯在线制服| 久久成人在线| 美国十次成人| 欧美性一二三区| 国产一区二区三区四区hd| 亚洲丰满在线| 一区二区三区四区蜜桃| 羞羞漫画18久久大片| 久久久久.com| 亚洲国产成人午夜在线一区| 日韩午夜三级在线| 欧美一级大片在线免费观看| 久久夜色精品国产欧美乱极品| 欧美大片在线观看| 国产精品免费看片| 免费人成精品欧美精品| 欧美日本不卡视频| 国产日韩成人精品| 在线免费不卡视频| 亚洲午夜高清视频| 久久蜜桃香蕉精品一区二区三区| 亚洲第一精品夜夜躁人人爽 | 久久精品欧美| 亚洲精品久久久久| 欧美一级片久久久久久久| 欧美激情视频在线播放| 国产精品伦理| 亚洲人成亚洲人成在线观看| 亚洲永久免费| 欧美激情亚洲综合一区| 亚洲欧美经典视频| 欧美精品一级| 一区二区三区自拍| 亚洲免费一级电影| 亚洲国产欧美在线| 久久国产精品亚洲77777| 欧美日韩精品一区二区三区| 永久555www成人免费| 亚洲自拍偷拍一区| 亚洲国产综合视频在线观看| 亚洲欧美日韩精品久久久| 欧美日韩免费观看一区| 亚洲成人中文| 久久久久久久激情视频| 亚洲午夜激情网站|