• <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>

            HLSL實現蒙皮動畫(2)

            Posted on 2008-12-02 16:39 Herbert 閱讀(1498) 評論(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


            中文字幕乱码人妻无码久久| 久久婷婷五月综合色奶水99啪| 久久国产精品久久| 国产三级观看久久| 欧美国产成人久久精品| 久久久久免费看成人影片| 久久久精品一区二区三区| 久久精品女人天堂AV麻| 久久经典免费视频| 狠狠色丁香婷婷久久综合不卡| 精品熟女少妇aⅴ免费久久| 亚洲国产美女精品久久久久∴ | 东方aⅴ免费观看久久av| 国产91色综合久久免费| 国产精品久久久久久久app | 99蜜桃臀久久久欧美精品网站| 91久久精一区二区三区大全| 伊人久久国产免费观看视频 | 亚洲午夜精品久久久久久app| 精品久久久久久久无码| 亚洲综合久久久| 精品无码人妻久久久久久| 久久亚洲精品成人AV| 久久亚洲国产成人影院| www.久久热.com| 久久发布国产伦子伦精品| 欧美日韩精品久久免费| 老司机午夜网站国内精品久久久久久久久 | MM131亚洲国产美女久久| 亚洲国产另类久久久精品小说 | 一本一本久久aa综合精品| 青青草国产97免久久费观看| 91精品国产综合久久香蕉| 久久国产精品-国产精品| 久久免费视频观看| 九九99精品久久久久久| 国产精品视频久久久| 91精品观看91久久久久久| 93精91精品国产综合久久香蕉| 久久亚洲精品中文字幕三区| 色综合久久久久网|