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

HLSL實現蒙皮動畫(2)

Posted on 2008-12-02 16:39 Herbert 閱讀(1521) 評論(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>
            野花国产精品入口| 亚洲国内自拍| 亚洲一区日韩| 亚洲黄色精品| 欧美91视频| 亚洲精品中文字幕有码专区| 欧美激情一区二区三区四区| 欧美国产精品va在线观看| 91久久国产综合久久91精品网站| 欧美成人黑人xx视频免费观看| 久久婷婷av| 91久久精品美女| 亚洲理伦电影| 国产欧美另类| 免播放器亚洲| 欧美美女bb生活片| 亚洲欧美国产另类| 久久精品电影| 国产亚洲综合性久久久影院| 欧美a一区二区| 国产精品av免费在线观看| 久久av一区| 欧美国产日韩一区二区在线观看| 亚洲一区二区三区在线看| 欧美亚洲日本一区| 亚洲日本乱码在线观看| 亚洲午夜av电影| 亚洲高清影视| 亚洲一二区在线| 91久久精品国产91久久| 亚洲一区二区三区免费观看| 国内精品久久久久影院薰衣草| 最新亚洲一区| 韩国女主播一区| 一区二区三区四区五区精品| 狠狠色丁香久久婷婷综合丁香| 日韩一级免费观看| 激情综合激情| 亚洲欧美成人综合| 99日韩精品| 久久久亚洲午夜电影| 亚洲欧美一区二区原创| 欧美成人精品在线| 久久综合久久综合这里只有精品| 欧美日韩在线一区二区| 欧美国产丝袜视频| 国产在线精品一区二区中文| 亚洲少妇自拍| 一区二区三区高清不卡| 久久免费黄色| 久久久久久久久伊人| 国产精品高清网站| 最新国产乱人伦偷精品免费网站 | 欧美亚洲三级| 正在播放欧美一区| 欧美激情第三页| 欧美成人精品一区二区| 国产一区二区三区免费观看| 亚洲一区二区三区视频播放| 亚洲色诱最新| 欧美日韩综合视频| 一本色道久久综合亚洲精品不 | 国产农村妇女毛片精品久久莱园子| 91久久一区二区| 亚洲欧洲精品一区二区| 免费精品视频| 欧美激情一区二区三区全黄 | 永久555www成人免费| 久久国产主播精品| 久久久一本精品99久久精品66| 国产美女精品一区二区三区 | 男人的天堂亚洲在线| 一区二区三区在线观看视频| 久久精品视频99| 麻豆精品一区二区av白丝在线| 狠狠色伊人亚洲综合成人| 久久久久国产精品一区三寸| 久久久久女教师免费一区| 国产综合欧美| 免播放器亚洲一区| 亚洲人成在线观看网站高清| 在线视频欧美精品| 国产精品免费看| 欧美亚洲综合在线| 久久综合色天天久久综合图片| 在线观看亚洲视频啊啊啊啊| 免费日韩av电影| 日韩视频在线一区二区| 亚洲欧美在线免费观看| 国产午夜精品福利| 男人的天堂亚洲| 日韩视频中文| 久久久久久97三级| 最新中文字幕一区二区三区| 欧美视频四区| 久久久噜噜噜久久人人看| 亚洲国产精品视频| 亚洲欧洲99久久| 在线观看91久久久久久| 欧美日韩国产系列| 欧美在线观看你懂的| 亚洲国产小视频在线观看| 亚洲欧美日韩国产一区二区| 韩国三级电影一区二区| 欧美日韩99| 久久电影一区| 一区二区久久久久久| 久久亚洲精品一区二区| 亚洲视频在线观看网站| 韩国在线一区| 国产精品青草久久| 你懂的一区二区| 欧美在线视频观看免费网站| 最新69国产成人精品视频免费| 久久精品国产精品亚洲| a4yy欧美一区二区三区| 韩国一区二区三区在线观看| 欧美三级电影精品| 老色鬼久久亚洲一区二区| 午夜精品久久久久久久99水蜜桃 | 久久精品91| 亚洲图片欧洲图片日韩av| 欧美黄色大片网站| 久久久99爱| 亚洲欧美综合精品久久成人 | 欧美体内谢she精2性欧美| 久久综合国产精品| 欧美在线日韩| 亚洲伊人一本大道中文字幕| 亚洲精品日韩激情在线电影| 久久在线91| 欧美亚洲日本一区| 亚洲一区二区不卡免费| 99这里只有精品| 亚洲激情第一区| 国产一区二区三区四区| 国产精品成人一区二区三区夜夜夜 | 免费在线日韩av| 久久久www成人免费精品| 午夜天堂精品久久久久| 亚洲欧美变态国产另类| 一片黄亚洲嫩模| 一本高清dvd不卡在线观看| 在线观看成人小视频| 狠狠久久婷婷| 国产综合久久久久影院| 国产一区二区高清视频| 国产精品入口福利| 国产精品久久国产精品99gif| 欧美日韩国产美| 欧美日韩在线一区| 国产精品激情| 国产精品男gay被猛男狂揉视频| 欧美午夜精品久久久久久人妖| 欧美日韩免费在线观看| 欧美日韩亚洲一区二区三区在线| 欧美成人有码| 欧美日韩在线播放三区四区| 欧美日韩精品一区二区三区四区| 欧美日韩一级大片网址| 欧美性色综合| 国产精品一区二区在线观看网站| 国产欧美一二三区| 激情欧美日韩| 亚洲青色在线| 亚洲一本视频| 欧美专区18| 免费日韩av片| 亚洲国产精品一区二区第四页av| 亚洲国产欧美日韩另类综合| 亚洲美女电影在线| 亚洲视频一区二区| 久久精品99国产精品日本| 美乳少妇欧美精品| 欧美日韩综合另类| 国产在线乱码一区二区三区| 亚洲黄色三级| 香蕉免费一区二区三区在线观看| 久久午夜色播影院免费高清| 女同一区二区| 中日韩在线视频| 久久久青草青青国产亚洲免观| 欧美精品免费观看二区| 国产九区一区在线| 亚洲精品一区二区三区av| 欧美一级网站| 欧美激情一区二区在线 | 欧美成人有码| 亚洲曰本av电影| 免费亚洲婷婷| 国产视频在线观看一区| 亚洲精品婷婷| 久久综合久久久久88| 亚洲特级毛片| 欧美va天堂| 国产综合自拍| 午夜欧美精品久久久久久久| 欧美激情综合| 久久亚洲一区二区三区四区| 国产精品日韩精品欧美在线|