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

HLSL實現蒙皮動畫(2)

Posted on 2008-12-02 16:39 Herbert 閱讀(1509) 評論(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>
            亚洲国产综合在线看不卡| 日韩天堂在线观看| 精品999网站| 国产精品尤物| 国产精品制服诱惑| 国产欧美日韩亚洲一区二区三区| 国产精品久久二区二区| 国产精品久久久久久亚洲调教 | 久久午夜电影| 欧美高清不卡| 国产精品九色蝌蚪自拍| 国产综合自拍| 日韩一区二区久久| 小嫩嫩精品导航| 毛片一区二区| 日韩一二三在线视频播| 欧美一区二区三区男人的天堂| 久久久久久香蕉网| 欧美日韩视频在线第一区| 国产精品国产亚洲精品看不卡15| 国产一区二区三区在线观看精品 | 91久久久久久久久久久久久| 91久久午夜| 亚洲欧美日韩精品久久久久 | 国产精品热久久久久夜色精品三区 | 欧美四级在线观看| 国内自拍一区| 在线视频日本亚洲性| 久久久久久久激情视频| 亚洲伦理在线观看| 老色批av在线精品| 国产欧美日韩视频| 亚洲视频一区| 亚洲第一黄色| 久久精视频免费在线久久完整在线看| 欧美日韩国产片| 在线成人h网| 欧美中文字幕不卡| 国产精品入口| 韩国视频理论视频久久| 亚洲二区在线视频| 欧美有码视频| 99riav国产精品| 欧美va天堂| 伊人狠狠色j香婷婷综合| 销魂美女一区二区三区视频在线| 亚洲国产电影| 久久久久久亚洲综合影院红桃 | 亚洲专区欧美专区| 欧美日韩视频专区在线播放| 在线精品亚洲| 香蕉久久夜色精品国产| 99综合精品| 欧美日韩一区二区在线播放| 亚洲精品韩国| 亚洲国产精品高清久久久| 久久久久成人精品免费播放动漫| 国产精品一区二区在线观看| 亚洲综合日韩在线| 亚洲视频在线视频| 国产精品视频1区| 亚洲欧美日韩精品综合在线观看| 99国产精品私拍| 欧美天天影院| 亚洲欧美日韩一区| 亚洲欧美美女| 国产一区在线看| 久久综合九色综合久99| 久久久水蜜桃| 亚洲人被黑人高潮完整版| 亚洲国产精品999| 欧美日本久久| 亚洲欧美日韩国产中文| 香蕉久久一区二区不卡无毒影院| 国产精品亚洲激情| 久久午夜精品一区二区| 开心色5月久久精品| 亚洲精品欧美在线| 一本色道久久综合狠狠躁篇的优点| 欧美午夜寂寞影院| 久久久国产精品亚洲一区| 久久夜色精品国产欧美乱极品| 亚洲九九九在线观看| 中文网丁香综合网| 黄色成人av网站| 亚洲人成网站999久久久综合| 欧美午夜久久久| 久久婷婷综合激情| 欧美日韩精品免费看| 欧美一区二区三区另类| 久久综合色88| 亚洲欧美中文在线视频| 久久视频免费观看| 亚洲一区黄色| 麻豆精品在线视频| 午夜日韩在线| 欧美黑人国产人伦爽爽爽| 欧美一区激情| 欧美剧在线免费观看网站| 亚洲一区二区动漫| 欧美日韩在线观看一区二区| 久久激情五月丁香伊人| 欧美国产乱视频| 久久精品伊人| 欧美日韩免费在线观看| 可以免费看不卡的av网站| 欧美日韩中文精品| 欧美不卡视频一区发布| 国产精品午夜春色av| 亚洲国产精品精华液2区45| 国产精品毛片a∨一区二区三区| 美女黄网久久| 国产精品三上| 日韩一级黄色av| 亚洲国产欧美久久| 欧美一区二区三区精品电影| 一区二区三区国产盗摄| 久久亚洲高清| 久久激情网站| 国产欧美日韩综合精品二区| 9人人澡人人爽人人精品| 亚洲人成网站色ww在线| 久久久久国内| 久久久久久久久久看片| 国产九九精品| 亚洲永久在线| 香蕉精品999视频一区二区| 欧美四级剧情无删版影片| 亚洲精品久久久久久下一站| 91久久精品国产91久久性色tv| 欧美亚洲一区二区在线观看| 午夜精品久久久久久久久| 国产精品wwwwww| 一区二区三区四区在线| 国产精品99久久不卡二区| 欧美精品在线一区| 亚洲精品小视频| 亚洲视频在线观看网站| 欧美色网一区二区| 在线视频一区观看| 欧美一区二区性| 国产一区av在线| 久久精品人人做人人爽| 蜜臀久久99精品久久久画质超高清| 韩日精品在线| 裸体歌舞表演一区二区| 亚洲国产成人av| 99精品免费| 国产精品分类| 午夜精品视频| 欧美不卡在线视频| 一本久久综合| 国产精品亚洲激情| 久久久久久久久蜜桃| 欧美国产日本高清在线| 日韩视频在线免费观看| 欧美三级中文字幕在线观看| 亚洲影视在线播放| 久久综合久久综合这里只有精品| 一区一区视频| 欧美精品日韩一区| 国产精品99久久久久久www| 久久精品2019中文字幕| 亚洲国产一二三| 欧美性淫爽ww久久久久无| 欧美一区二区三区视频免费| 欧美韩国日本一区| 亚洲自拍电影| 久久久久久高潮国产精品视| 亚洲日本中文字幕免费在线不卡| 欧美了一区在线观看| 亚洲伊人色欲综合网| 免费观看成人| 亚洲午夜三级在线| 国内激情久久| 欧美日韩精品久久久| 久久国产精品久久w女人spa| 亚洲人成高清| 久久久精品五月天| aa成人免费视频| 韩日成人av| 国产精品久久99| 欧美不卡在线视频| 午夜精品成人在线| 亚洲精品免费网站| 久久综合久久综合久久| 亚洲欧美另类国产| 亚洲毛片av| 国内精品一区二区三区| 欧美日韩小视频| 久久精品日产第一区二区三区| 一区二区三区高清在线观看| 欧美va亚洲va香蕉在线| 午夜精品剧场| 一区二区三区产品免费精品久久75| 樱桃国产成人精品视频| 国产精品一区=区| 欧美性大战久久久久| 欧美大片一区二区| 久久这里有精品视频|