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

麒麟子

~~

導航

<2009年7月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

統計

常用鏈接

留言簿(12)

隨筆分類

隨筆檔案

Friends

WebSites

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

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

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

http://supertuxkart.sourceforge.net/

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

 

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

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

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

 

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

 

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

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

查看代碼可以發現,當你設置了這個為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 是被認為是無效的

 

然后,我們來創建一個SHADER作為渲染。

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

那,我們為這個結點創建一個材質 在創建材質前,我們需要準備一個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);
    }
};

 

好了,現在我們來創建一個材質

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

//用新創建出來的材質賦值給這個結點

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 麒麟子 閱讀(3362) 評論(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>
            黄色在线一区| 欧美三级在线播放| 亚洲国产精品精华液2区45| 久久视频在线看| 免费成人毛片| 一本色道久久综合狠狠躁篇怎么玩 | 欧美高清hd18日本| 一本色道久久精品| 亚洲综合视频在线| 在线观看中文字幕亚洲| 亚洲电影在线| 国产精品久久久久久久9999 | 最近中文字幕mv在线一区二区三区四区 | 久久久久久久一区二区| 久久免费的精品国产v∧| 亚洲欧洲三级| 午夜精品电影| 亚洲毛片一区二区| 亚洲欧美日韩视频二区| 亚洲第一精品电影| 一本久道久久久| 国产一区二区三区在线观看精品 | 欧美在线播放高清精品| 亚洲理论电影网| 亚洲欧美影音先锋| 亚洲一区免费在线观看| 你懂的国产精品永久在线| 在线视频亚洲欧美| 欧美一区激情| 一区二区三区免费网站| 午夜精品电影| 一区二区精品在线| 久久免费国产| 久久久久久久综合| 国产精品国产三级国产aⅴ入口| 午夜精品理论片| 欧美日韩高清在线播放| 另类av导航| 国产乱子伦一区二区三区国色天香| 男女精品网站| 国内精品久久国产| 亚洲视频免费观看| 一区二区久久久久| 欧美高清在线观看| 女同一区二区| 黑人一区二区三区四区五区| 一区二区三区四区五区精品视频| 亚洲国产另类精品专区| 欧美一区二区三区成人| 亚洲女人天堂成人av在线| 欧美国产高清| 欧美国产日韩免费| 亚洲国产精品va在看黑人| 久久国产福利国产秒拍| 久久动漫亚洲| 国产日韩精品视频一区| 亚洲女同性videos| 久久国产精品99国产| 国产精品伦子伦免费视频| 中文久久乱码一区二区| 亚洲一区精品在线| 国产精品久久久久久久久久久久久 | 亚洲精品视频免费观看| 亚洲精品欧美激情| 欧美国产精品日韩| 亚洲精品三级| 亚洲一区二区精品| 国产精品久在线观看| 亚洲欧美在线另类| 久久久久免费| 亚洲风情亚aⅴ在线发布| 久久综合亚洲社区| 亚洲欧洲一区二区在线播放| 99ri日韩精品视频| 国产精品成人aaaaa网站| 亚洲香蕉在线观看| 久久精品国产清自在天天线| 黑人极品videos精品欧美裸| 看片网站欧美日韩| 亚洲日产国产精品| 午夜免费电影一区在线观看 | 美女性感视频久久久| 亚洲国产一区二区视频| 在线视频精品一区| 国产视频一区二区在线观看| 久久久久成人网| 亚洲毛片av| 久久超碰97人人做人人爱| 1769国产精品| 亚洲欧美日韩一区二区三区在线| 尤物精品在线| 欧美日韩亚洲高清| 久久成人免费| 日韩视频免费大全中文字幕| 午夜精品美女久久久久av福利| 国产亚洲女人久久久久毛片| 欧美h视频在线| 亚洲综合色丁香婷婷六月图片| 久久人人爽爽爽人久久久| 一本久久a久久精品亚洲| 国产亚洲成av人在线观看导航| 在线亚洲国产精品网站| 国产欧美日韩另类一区| 欧美国产日韩在线| 欧美一级片在线播放| 亚洲日本无吗高清不卡| 久久国产一区二区| 一区二区高清| 91久久久久久久久| 国产一区二区成人久久免费影院| 欧美另类视频| 久久看片网站| 欧美一区二区三区免费视| 亚洲精品国产无天堂网2021| 久久香蕉国产线看观看av| 在线亚洲一区| 亚洲精品资源美女情侣酒店| 国内激情久久| 国产美女精品| 国产精品久久久久久久久久久久久久 | 在线精品国产成人综合| 国产精品免费视频xxxx| 欧美日韩高清在线一区| 女同性一区二区三区人了人一| 欧美在线影院| 欧美一区二区播放| 亚洲欧美日韩国产| 亚洲综合999| 亚洲一区二区三区在线视频| 亚洲精品中文字幕女同| 亚洲狠狠婷婷| 亚洲国产另类 国产精品国产免费| 久久亚洲综合色| 久久久www成人免费无遮挡大片 | 亚洲精选在线| 亚洲精品欧美一区二区三区| 亚洲成人在线观看视频| 在线精品国产欧美| 136国产福利精品导航网址应用 | 欧美精品九九99久久| 欧美成人亚洲成人| 欧美成人精品福利| 欧美电影美腿模特1979在线看| 久久在线观看视频| 免费在线亚洲| 欧美精品在线播放| 欧美日韩在线视频观看| 欧美午夜精品久久久久久浪潮| 欧美日韩午夜在线视频| 欧美日韩国产小视频在线观看| 欧美日韩精品在线播放| 国产精品久久久久av免费| 国产精品入口麻豆原神| 国产欧美一区二区精品忘忧草| 国产区亚洲区欧美区| 黑丝一区二区| 亚洲精品在线免费| 亚洲欧美一区二区三区在线| 亚洲电影专区| 欧美日韩国产精品一卡| 国产精品xxxxx| 亚洲黄页一区| 一区二区日韩| 久久成人国产| 欧美韩日亚洲| 国产精品午夜av在线| 激情婷婷亚洲| 999在线观看精品免费不卡网站| 一二三四社区欧美黄| 欧美一区二区三区在线| 免费成人黄色片| 亚洲免费观看视频| 欧美一区免费| 欧美区日韩区| 国产一区欧美日韩| 一本一道久久综合狠狠老精东影业 | 激情文学一区| 亚洲一区日韩在线| 美国十次了思思久久精品导航| 最新国产成人在线观看| 欧美一级片久久久久久久| 欧美成黄导航| 韩国女主播一区| 亚洲免费在线精品一区| 欧美大香线蕉线伊人久久国产精品| 日韩视频在线观看免费| 久久久久综合一区二区三区| 欧美色另类天堂2015| 影音先锋另类| 亚洲欧美日韩另类| 亚洲欧洲三级| 久久久久久亚洲精品杨幂换脸| 国产精品久久久久99| 亚洲精品日韩久久| 另类图片国产| 久久gogo国模啪啪人体图| 国产精品成人一区二区| 亚洲精品小视频在线观看| 久久中文精品| 性欧美video另类hd性玩具|