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

HLSL實現蒙皮動畫(2)

Posted on 2008-12-02 16:39 Herbert 閱讀(1511) 評論(0)  編輯 收藏 引用 所屬分類: DirectX
   HLSL怎么實現蒙皮動畫的呢?其實就是在頂點著色階段根據傳入的頂點權重、骨骼矩陣信息來計算頂點的實際位置。

SkinningMesh.fx#include "skin.vsh"

//----------- normal global value-----------------
//

extern matrix   g_vMatrix;
extern matrix   g_pMatrix;
extern matrix  g_vpMatrix;
extern vector  g_eyePos;
extern vector  g_lightDir;

 

//------------ global value for skinned mesh----------
//

extern float4   g_lightDiffuse = { 0.6f, 0.6f, 0.6f, 1.0f};
extern float4  g_materialAmbient : MATERIALAMBIENT = {0.1f, 0.1f, 0.1f, 1.0f};
extern float4   g_materialDiffuse : MATERIALDIFFUSE = {0.8f, 0.8f, 0.8f, 1.0f};
static const int MAX_MATRICES = 26;
extern float4x3  g_mWorldMatrixArray[ MAX_MATRICES] : WORLDMATRIXARRAY;
extern int  g_curNumBones = 2;

 

struct VS_INPUT
{
 float4 pos : POSITION;

 //---- for skinned mesh---
 //

 float3 blendWeights : BLENDWEIGHT;
 float4 blendIndices : BLENDINDICES;

 float3 nor : NORMAL;
 float3 tex : TEXCOORD0;
};

 


struct VS_OUTPUT
{
 float4 pos : POSITION;
 float4 diffuse : COLOR;
 float2 tex : TEXCOORD0;
};

 

VS_OUTPUT VS_SkinningMesh(VS_INPUT input)
{
 VS_OUTPUT output = (VS_OUTPUT)0;

 //---------- skinned mesh------------

 float3 pos = 0.0f;
 float3  nor = 0.0f;
 float lastWeight = 0.0f;

 VS_SKIN_INPUT vsi = { input.pos, input.blendWeights, input.blendIndices, input.nor };
 VS_SKIN_OUTPUT vso = VS_Skin( vsi, g_curNumBones); 

 matrix vpMatrix = mul( g_vMatrix, g_pMatrix);
 output.pos = mul( float4( vso.vPos.xyz, 1.0f), vpMatrix);

 nor = normalize( vso.vNor );

 output.diffuse = float4( g_materialAmbient.xyz + saturate( dot( nor, g_lightDir.xyz ) ) * g_materialDiffuse.xyz, 1.0 );

 output.tex = input.tex.xy;

 return output;
}


technique tec0
{
 pass pass0
 {
  vertexShader = compile vs_2_0 VS_SkinningMesh();
 }
}

 



在這里使用到DirectX例子里面使用到的一個文件:skin.vsh。代碼如下:

skin.vsh//
// HLSL function for skinning a mesh.  In your shader, you can #define
// MATRIX_PALETTE_SIZE if desired, and then #include this file.
// Copyright (c) 2000-2003 Microsoft Corporation. All rights reserved.
//


#ifndef VS_SKIN_VSH
#define VS_SKIN_VSH


//----------------------------------------------------------------------------
// Global parameters
//----------------------------------------------------------------------------


// Declare the 4x3 matrix palette.  This is the array of bone matrices used in
// skinning vertices.

// The palette size is 26 by default.  This is sufficiently small for most
// vs_1_1 shaders.  Shaders targeted at vs_2_0 and above can set this higher
// to accommondate more bones in a call.  For example, tiny_anim.x has 35
// bones, and so can be rendered in a single call if MATRIX_PALETTE_SIZE is
// set to 35 or more.

// An HLSL shader can set MATRIX_PALETTE_SIZE_DEFAULT to a different value.
// The calling app can also set it in the D3DXMACRO structure when compiling
// the shader.  The calling app can query the actual palette size by examining
// MATRIX_PALETTE_SIZE (but changing it after compilation will not change the
// palette size in the compiled shader, of course).


#ifndef MATRIX_PALETTE_SIZE_DEFAULT
#define MATRIX_PALETTE_SIZE_DEFAULT 26
#endif

const int MATRIX_PALETTE_SIZE = MATRIX_PALETTE_SIZE_DEFAULT;
float4x3 amPalette[ MATRIX_PALETTE_SIZE_DEFAULT ];


//----------------------------------------------------------------------------
// Shader body - VS_ Skin
//----------------------------------------------------------------------------

// define the inputs -- caller must fill this, usually right from the VB
struct VS_SKIN_INPUT
{
    float4      vPos;
    float3      vBlendWeights;
    float4      vBlendIndices;
    float3      vNor;
};

// return skinned position and normal
struct VS_SKIN_OUTPUT
{
    float4 vPos;
    float3 vNor;
};

// call this function to skin VB position and normal
VS_SKIN_OUTPUT VS_Skin( const VS_SKIN_INPUT vInput, int iNumBones )
{
    VS_SKIN_OUTPUT vOutput = (VS_SKIN_OUTPUT) 0;

    float fLastWeight = 1.0;
    float fWeight;
    float afBlendWeights[ 3 ] = (float[ 3 ]) vInput.vBlendWeights;
    int aiIndices[ 4 ] = (int[ 4 ]) D3DCOLORtoUBYTE4( vInput.vBlendIndices );
   
    for( int iBone = 0; (iBone < 3) && (iBone < iNumBones - 1); ++ iBone )
    {
        fWeight = afBlendWeights[ iBone ];
        fLastWeight -= fWeight;
        vOutput.vPos.xyz += mul( vInput.vPos, amPalette[ aiIndices[ iBone ] ] ) * fWeight;
        vOutput.vNor     += mul( vInput.vNor, amPalette[ aiIndices[ iBone ] ] ) * fWeight;
    }
   
    vOutput.vPos.xyz += mul( vInput.vPos, amPalette[ aiIndices[ iNumBones - 1 ] ] ) * fLastWeight;
    vOutput.vNor     += mul( vInput.vNor, amPalette[ aiIndices[ iNumBones - 1 ] ] ) * fLastWeight;

    return vOutput;
}


#endif // #ifndef VS_SKIN_VSH


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品99久久久久久宅男| 欧美一区91| 国产精品免费一区豆花| 日韩视频不卡中文| 欧美黑人一区二区三区| 久久国产精品色婷婷| 国产精品国产自产拍高清av王其| 亚洲精品欧洲| 牛人盗摄一区二区三区视频| 西瓜成人精品人成网站| 国产精品久久久一区二区三区 | 国产深夜精品福利| 亚洲一二区在线| 亚洲人成网站在线观看播放| 老牛影视一区二区三区| 在线色欧美三级视频| 老鸭窝亚洲一区二区三区| 午夜视频在线观看一区二区| 国产精品vvv| 一区二区日韩伦理片| 亚洲人成网站精品片在线观看| 蜜臀91精品一区二区三区| 亚洲国产精品www| 欧美成人中文| 欧美激情第8页| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲欧美日韩国产中文| 一本色道久久88精品综合| 亚洲国内自拍| 欧美日本国产精品| 日韩一级视频免费观看在线| 欧美激情久久久久久| 免费观看国产成人| 99re这里只有精品6| 亚洲国产毛片完整版| 欧美屁股在线| 亚洲一区尤物| 欧美一区二区在线看| 尤物网精品视频| 免费一区二区三区| 欧美精品在线观看一区二区| 久久精品视频va| 欧美日韩国产成人在线观看| 亚洲天堂av在线免费观看| 亚洲一区免费在线观看| 国产亚洲女人久久久久毛片| 免费成年人欧美视频| 欧美日韩在线播| 久久久久国产精品厨房| 蜜桃视频一区| 亚洲欧美另类中文字幕| 久久国产成人| 在线视频你懂得一区| 久久久av水蜜桃| 99精品久久免费看蜜臀剧情介绍| 亚洲一区高清| 亚洲精品免费一二三区| 亚洲欧美99| 亚洲国产精品成人精品| 亚洲尤物在线视频观看| 亚洲国产精品第一区二区| 中文精品视频一区二区在线观看| 黑人中文字幕一区二区三区 | 亚洲午夜小视频| 国产主播喷水一区二区| 亚洲精品视频免费观看| 韩国三级在线一区| av成人天堂| 亚洲第一精品影视| 亚洲一区在线免费| 亚洲精品自在久久| 欧美中文字幕在线播放| 在线亚洲欧美视频| 美女久久一区| 久久久亚洲精品一区二区三区 | 欧美日韩一级视频| 欧美gay视频| 国产亚洲欧美一区| 在线亚洲美日韩| 日韩一级二级三级| 久久手机精品视频| 久久精品国产第一区二区三区最新章节| 欧美精品一区二区三区视频| 麻豆91精品91久久久的内涵| 国产免费一区二区三区香蕉精| 亚洲国内精品| 亚洲成人在线观看视频| 午夜免费电影一区在线观看| 亚洲专区在线| 欧美日韩精品二区第二页| 欧美激情一区二区三区高清视频| 国产视频精品xxxx| 亚洲欧美日韩国产综合在线| 制服诱惑一区二区| 欧美日韩另类一区| 欧美高清在线视频| 影音先锋一区| 久久亚洲一区二区三区四区| 久久久五月天| 亚洲高清成人| 美女爽到呻吟久久久久| 欧美福利小视频| 亚洲人体1000| 欧美日韩蜜桃| 国产日韩精品一区二区| 亚洲欧美成人精品| 欧美一区网站| 国产日韩欧美一区二区三区在线观看 | 国产午夜精品理论片a级大结局| 亚洲午夜久久久| 国产亚洲综合精品| 欧美一区二区三区四区在线 | 在线免费观看成人网| 久久久水蜜桃av免费网站| 美腿丝袜亚洲色图| 亚洲精品免费电影| 欧美午夜欧美| 性欧美暴力猛交69hd| 欧美成人69| 国产日韩精品一区二区| 久久久久五月天| 亚洲国产片色| 欧美一区二区啪啪| 国内精品模特av私拍在线观看| 久久久久久婷| 亚洲精品久久久久久久久久久久久 | 欧美剧在线免费观看网站| 99v久久综合狠狠综合久久| 亚洲制服欧美中文字幕中文字幕| 国产精品久久久久秋霞鲁丝| 欧美一区二区三区久久精品茉莉花 | 国产精品福利网| 欧美一区二区三区在线免费观看| 欧美fxxxxxx另类| 中国亚洲黄色| 黄色小说综合网站| 欧美伦理91i| 亚洲国产综合在线| 久久成人一区二区| 99成人在线| 国产午夜精品一区二区三区视频 | 国产精品久久久999| 久久亚洲春色中文字幕| 日韩午夜电影| 免费看成人av| 亚洲欧美成人网| 亚洲成人自拍视频| 国产精品日韩欧美一区| 免费成人av在线| 欧美一区二区精品在线| 亚洲乱码国产乱码精品精可以看 | 99视频精品在线| 一区二区视频免费完整版观看| 欧美激情一区二区三区成人| 欧美一区1区三区3区公司| 日韩一区二区高清| 亚洲精品在线一区二区| 麻豆精品网站| 久久不射2019中文字幕| 日韩亚洲国产欧美| 欧美大片免费| 久热国产精品| 久久精品国产亚洲精品| 亚洲午夜久久久久久久久电影网| 亚洲国产一区二区三区高清 | 欧美激情在线狂野欧美精品| 韩国三级在线一区| 亚洲丶国产丶欧美一区二区三区| 久久综合九色综合欧美就去吻 | 欧美成人免费在线视频| 欧美精品日韩综合在线| 99热免费精品在线观看| 欧美国产日产韩国视频| 99精品久久久| 亚洲精品乱码久久久久| 激情综合色综合久久综合| 国产精品欧美日韩久久| 欧美日韩精品免费观看视频完整| 快射av在线播放一区| 久久精品五月| 麻豆精品传媒视频| 久久久久久久97| 午夜精品久久久久久久久久久久| 一级成人国产| 一区二区三区精品视频在线观看| 在线观看亚洲精品视频| 国产综合视频| 亚洲第一天堂av| 亚洲激情av| 91久久国产综合久久蜜月精品| 黄色成人av网| 亚洲激情电影在线| 亚洲人久久久| 亚洲婷婷综合色高清在线| 亚洲一区在线观看免费观看电影高清| 亚洲午夜久久久| 欧美一级理论性理论a| 午夜一区二区三区不卡视频|