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

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            #

            今天把原來寫的max插件與新引擎整合下, MAXSDK又惡心了一次. 居然有core.lib這種第三方庫導致與我的core.lib鏈接沖突, 真是霸道, 沒辦法, 只有我讓步,我改名.

            之后,發現每次即便每次完整編譯完成,開始調試時,所有工程都會重復編譯一次,Clean后,再編譯,報了 一個vc90.pdb有關的C2859錯誤.

            error C2859: x:\XXX\vc60.pdb is not the pdb file that was used when this precompiled header was created, recreate the precompiled header.
            mschart.cpp

             

            大概意思就是預編譯頭問題. 嘗試著改名等,都不能完全解決, 干脆在Configuration Properties | C/C++  | Output Files里的Program Database File Name改為$(IntDir)\$(ProjectName).pdb, 也就是讓 靜態庫pdb不是默認的vc90.pdb,而是跟隨項目名稱,瞬間, 問題解決,不會反復出現重編譯問題.

            寫本文之前,Google了下其他人怎么解決這樣的問題,結果居然看到有人說去掉預編譯頭. 這不是我做事的方法,為什么不動下腦筋解決這個問題呢?

            posted @ 2010-05-21 17:17 戰魂小筑 閱讀(6040) | 評論 (0)編輯 收藏

            CEGUI的字符串類設計的初衷是以32個字符為分界點, 低于32個字符使用固定buffer, 高于才使用棧分配內存存儲字符串. 不過因為CEGUI使用utf32,兼容性雖然很好,但是在VC調試器里無法顯示是個很大的問題.

            這里參考了mybios博客中的文章,給CEGUI字符串做一個patch

            然后需要找到vs2008的autoexp.dat文件

            XP下位于:C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\autoexp.dat

            用記事本等工具打開, 在AutoExpand段中像這樣添加:

            [AutoExpand]
            ; CEGUI String
            CEGUI::String = str =<d_quickbuff,su> length =<d_cplength>

            即可在VC調試器中看到CEGUI字符串內容, 不過中文還是暫時無法支持

            posted @ 2010-05-14 12:01 戰魂小筑 閱讀(1864) | 評論 (0)編輯 收藏

            要在游戲中用到強大而有擴展性的骨骼動畫,有很多注意點.

            首先,我們得棄用CPU蒙皮, 雖然兼容性好,但是面對現今多核但并不提高單核速率的情況下,GPU還是王道.而且GPU蒙皮代碼可能更簡單,不過也有一點小缺點, 對于小引擎來說,Shader必須給靜態模型和骨骼動畫模型寫兩套.

            其次我們需要加強一個SubSkin的骨骼支持數量. 骨骼動畫上的每個SubSkin都是一次Draw, 但是按照傳統骨骼動畫系統,每個骨頭對應一個矩陣傳入,那么SM2.0保守計算只能支持50根骨頭. 不過在我前段時間的文章中有提到這個技術.并且已經在我的骨骼動畫系統及OGRE中實現,效果很好.

            美術也許很反感一個人物做1個SubSkin, 他們更新好多個SubSkin,也就是說身體每個部分都是一個SubSkin, 這樣方便修改, 同時系統支持的骨骼數量還可以有一定量的上升.不過我們還需要做一個索引工作. 傳統的GPU骨骼動畫中總是在渲染SubSkin前傳入所有這些SubSkin需要用到的骨骼矩陣. 但是每個SubSkin并不一定能用到所有的這些矩陣,這明顯是一種浪費. 因此在OGRE中做過一次索引預處理,也就是將每個SubSkin用到的骨骼統計出來, 在渲染這次SubSkin時才重新傳到GPU. 很明顯,這是用速度還空間和兼容性. 如果在DX10以上,有ConstantBuffer還好. DX9實在太慢了

            使用Marker點的換裝系統很難處理例如貼身衣物這類物件換裝. OGRE中有一種共享骨骼的技術, 可以支持, 不過從代碼分析看來,這種技術對CPU端骨骼計算量實在是大的驚人. 因此我們決定將整個SubSkin(也就是SubEntity)換掉,這樣由美術根據不同換裝類型來將衣服在MAX中直接綁定好后直接替換原始模型中的SubSkin即可達到換裝效果.可以說這是從動態計算到靜態預處理的轉變,效率提升很多.

            posted @ 2010-05-11 10:21 戰魂小筑 閱讀(2386) | 評論 (1)編輯 收藏

            在逛http://www.opengpu.org/index.php 時發現一個優秀的ARPG客戶端引擎LingEngine

            各位可以下載看下

             

            image

            從直觀個人分析該引擎技術包括:

            1. 基于SlimDX的.NET引擎

            2. JavaScript腳本

            3. 場景剔除效率還不錯

            4. 手感非常棒, 不亞于WOW

             

            博客里還有幾篇關于保留模式引擎的討論. 個人覺得這大概是以后的趨勢. 微軟的WPF首先當了炮灰, 慶幸.

            posted @ 2010-05-07 10:12 戰魂小筑 閱讀(2699) | 評論 (2)編輯 收藏

            首先參考SDK里這個函數的定義:

            HRESULT DrawIndexedPrimitiveUP(

            D3DPRIMITIVETYPE PrimitiveType,

            UINT MinVertexIndex,

            UINT NumVertices,

            UINT PrimitiveCount,

            CONST void * pIndexData,

            D3DFORMAT IndexDataFormat,

            CONST void* pVertexStreamZeroData,

            UINT VertexStreamZeroStride

            );

             

            這里假設我們要繪制一個由2個三角形組成的面,那么參數這樣設置

            MinVertexIndex = 0;

            NumVertices = 4;

            PrimitiveCount = 2;

            pIndexData = { 0,1, 2, 0, 2, 3}

            IndexDataFormat = D3DFMT_INDEX16

            pVertexStreamZeroData = { 4個角的位置 }

            VertexStreamZeroStride  = { 結構體的跨度 }

             

            我們注意到, 沒有任何一個參數用于描述CONST void * pIndexData的size 大小.

            但其實你的圖元是可以正確繪制的, 但是你并沒有在indexdata后面加上例如字符串0的結尾副,那么D3D是怎么知道IndexCount呢?

            我們先看下怎么根據VertexCount及 PrimitveType確定 PrimitiveCount

            PrimitveType 公式
            D3DPT_POINTLIST PrimitiveCount = VertexCount
            D3DPT_LINELIST PrimitiveCount = VertexCount/2
            D3DPT_LINESTRIP PrimitiveCount = VertexCount-1
            D3DPT_TRIANGLELIST PrimitiveCount = VertexCount/3
            D3DPT_TRIANGLESTRIP PrimitiveCount = VertexCount-2

            注: D3DPT_TRIANGLEFAN在以后的驅動中已經不再使用,因此不再采用

            當使用索引緩沖時, VertexCount = IndexCount

            因此在上例中 PrimitiveCount = IndexCount/3

            也就是說 IndexCount = PrimitiveCount * 3

            代入PrimitiveCount = 2,因此 IndexCount = 6

             

            因此穩定的API的函數參數設計是絕不會浪費任何一個參數的

            posted @ 2010-05-05 17:07 戰魂小筑 閱讀(1576) | 評論 (1)編輯 收藏

            #define MS_VC_EXCEPTION 0x406d1388
             
            typedef struct tagTHREADNAME_INFO
            {
                DWORD dwType;        // must be 0x1000
                LPCSTR szName;       // pointer to name (in same addr space)
                DWORD dwThreadID;    // thread ID (-1 caller thread)
                DWORD dwFlags;       // reserved for future use, most be zero
            } THREADNAME_INFO;
             
            void SetThreadName(DWORD dwThreadID, LPCTSTR szThreadName)
            {
                THREADNAME_INFO info;
                info.dwType = 0x1000;
                info.szName = szThreadName;
                info.dwThreadID = dwThreadID;
                info.dwFlags = 0;
             
                __try
                {
                    RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(DWORD),
            (DWORD *)&info);
                }
                except (EXCEPTION_CONTINUE_EXECUTION)
                {
                }
            }

             

            線程名稱限制在9個ANSI字符內,調用這個函數后,將觸發一個調試器異常,VC調試器將會把字符串設置為線程名稱,并在調試器中顯示

            posted @ 2010-05-04 15:28 戰魂小筑 閱讀(1917) | 評論 (0)編輯 收藏

            CSDN上有這么一篇文章, 說的是VC/MFC用WPF, 當我翻到回帖第20樓時,我囧了,還沒見過有那么執著的童鞋

             

            回復于:2010-05-03 09:14:20

            請問樓主是用VC.net嗎? 中文版

            如果在VC6下怎么做呢?能否給個vc6的工程實例,畢竟大多數人還是用VC6。

            現在都是VS2010( VC10 ) 時代了, WPF已經不是VC6能兼容的了

            看著某些童鞋,每天無止境的將標準C++代碼不斷翻譯成VC6only代碼, 為什么不把精力放在代碼設計上呢?

            萬惡的VC6中文版, XX公司漢化的這個版本不知道害了多少人

            我曾經回復無數人的博客,解釋VC6的BUG. 這些童鞋居然一致堅持說VC6簡單.

            也許他們總是認為: VC的代碼與二進制在調試時不匹配, 數組越界等等問題,都是自己掌握語言不足而引起的.

            人與動物最大的區別就是使用工具, 高效優質的工具提高工作效率

            posted @ 2010-05-03 18:01 戰魂小筑 閱讀(3827) | 評論 (23)編輯 收藏

                 摘要:   閱讀全文
            posted @ 2010-04-26 19:47 戰魂小筑 閱讀(15638) | 評論 (0)編輯 收藏

            傳統的蒙皮骨骼動畫混合方法易于理解,但是在SM 2.0的256常量限制下,骨骼數保守計算最多50根骨頭,因此對美術的工作流程以及模型渲染方法造成了很大的障礙

            float4x4 matBoneArray[40]; //  這是傳輸的瓶頸
             
            VS_OUTPUT vs_main( SkinnedVS_INPUT In )
            {
             
                VS_OUTPUT Out = (VS_OUTPUT)0;
             
                float4x4 skinTransform = 0;
             
                skinTransform += matBoneArray[In.BoneIndices.x] * In.BoneWeights.x;
                skinTransform += matBoneArray[In.BoneIndices.y] * In.BoneWeights.y;
                skinTransform += matBoneArray[In.BoneIndices.z] * In.BoneWeights.z;
                skinTransform += matBoneArray[In.BoneIndices.w] * In.BoneWeights.w;
                float4 localpos = mul(In.Position, skinTransform);
                
                Out.Position = mul( localpos, matViewProj ); 
                Out.TexCoord = In.TexCoord;
              
                return Out;
            }

            matBoneArray這個數組是骨骼的LocalRot和LocalTranslation 通過以下函數build出來

                Matrix4& Matrix4::FromTranslationRotation( const Vector3& translation, const Quaternion& rotation )
                {
                    float xx = rotation.x * rotation.x * 2.0f, yy = rotation.y * rotation.y * 2.0f, zz = rotation.z * rotation.z * 2.0f;
                    float xy = rotation.x * rotation.y * 2.0f, zw = rotation.z * rotation.w * 2.0f, xz = rotation.x * rotation.z * 2.0f;
                    float yw = rotation.y * rotation.w * 2.0f, yz = rotation.y * rotation.z * 2.0f, xw = rotation.x * rotation.w * 2.0f;
             
                    m[0][0] = 1.0f - yy - zz; m[0][1] =        xy + zw; m[0][2] =        xz - yw; m[0][3] = 0.0f;
                    m[1][0] =        xy - zw; m[1][1] = 1.0f - xx - zz; m[1][2] =        yz + xw; m[1][3] = 0.0f;
                    m[2][0] =        xz + yw; m[2][1] =        yz - xw; m[2][2] = 1.0f - xx - yy; m[2][3] = 0.0f;
                    m[3][0] =  translation.x; m[3][1] =  translation.y; m[3][2] =  translation.z; m[3][3] = 1.0f;
             
                    return *this;
                }

            從這里你可以發現, 本來每根骨頭只需要2個float4 傳遞變換信息的,現在卻需要4個float4,也就是一個矩陣來傳遞,矩陣中還有很多不使用的變量也被傳輸到GPU中,這里就是優化的點.

            重新調整后的Shader代碼:

            float4x4 BuildFromTransRot( float4 translation, float4 rot )
            {
                float4 rotation = rot;
                
                float xx = rotation.x * rotation.x * 2.0f, yy = rotation.y * rotation.y * 2.0f, zz = rotation.z * rotation.z * 2.0f;
                float xy = rotation.x * rotation.y * 2.0f, zw = rotation.z * rotation.w * 2.0f, xz = rotation.x * rotation.z * 2.0f;
                float yw = rotation.y * rotation.w * 2.0f, yz = rotation.y * rotation.z * 2.0f, xw = rotation.x * rotation.w * 2.0f;
                float4x4 m = { 
                {1.0f - yy - zz,             xy + zw,             xz - yw,         0},
                {xy - zw,              1.0f - xx - zz,             yz + xw,         0},
                {xz + yw,                      yz - xw,     1.0f - xx - yy,         0},
                {translation.x,       translation.y,       translation.z,         1}
                
                };
                
                return m;
            }
             
            float4x4 GetBoneElement( float index )
            {
                return BuildFromTransRot( vecBoneLocalTrans[index], vecBoneLocalRot[index] );
            }

            VS_OUTPUT vs_main( SkinnedVS_INPUT In )
            {
             
                VS_OUTPUT Out = (VS_OUTPUT)0;
             
                float4x4 skinTransform = 0;
             
                skinTransform += GetBoneElement(In.BoneIndices.x) * In.BoneWeights.x;
                skinTransform += GetBoneElement(In.BoneIndices.y) * In.BoneWeights.y;
                skinTransform += GetBoneElement(In.BoneIndices.z) * In.BoneWeights.z;
                skinTransform += GetBoneElement(In.BoneIndices.w) * In.BoneWeights.w;
                float4 localpos = mul(In.Position, skinTransform);
                
                Out.Position = mul( localpos, matViewProj ); 
                Out.TexCoord = In.TexCoord;
              
                return Out;
            }

            我們將骨頭的local旋轉及偏移傳遞至GPU,然后在GPU內重組,雖然對GPU性能計算有部分損耗,但是骨骼數量就能保守提高到100個.

            posted @ 2010-04-26 13:31 戰魂小筑 閱讀(3653) | 評論 (7)編輯 收藏

            引擎中的每個工程均以靜態庫方式鏈接到最后的exe. 代碼中包含有靜態類成員,第一次運行正常,后面不知什么原因, 這些靜態類成員不會被初始化, 在 crtexec.c 的CRT 初始化全局類成員函數

            static void __cdecl _initterm (
            #endif  /* CRTDLL */
                    _PVFV * pfbegin,
                    _PVFV * pfend
                    )
            {
                    /*
                     * walk the table of function pointers from the bottom up, until
                     * the end is encountered.  Do not skip the first entry.  The initial
                     * value of pfbegin points to the first valid entry.  Do not try to
                     * execute what pfend points to.  Only entries before pfend are valid.
                     */
                    while ( pfbegin < pfend )
                    {
                        /*
                         * if current table entry is non-NULL, call thru it.
                         */
                        if ( *pfbegin != NULL )
                            (**pfbegin)();
                        ++pfbegin;
                    }
            }

             

             

            這個函數會初始化所有鏈接到exe中的全局函數構造, 跟蹤這個地方, 發現,只有1個lib中的能被正確調用,但是出問題的那個lib中所有構造都不能被調用. 嘗試調整編譯順序無果

            唯一的方法只有修改架構為在winmain內進行構造

            如果有這方面調試經驗的同學可以回帖,謝謝

            posted @ 2010-04-23 17:47 戰魂小筑 閱讀(1529) | 評論 (6)編輯 收藏

            僅列出標題
            共26頁: First 13 14 15 16 17 18 19 20 21 Last 
            久久最新免费视频| 久久不见久久见免费视频7| 久久久精品一区二区三区| 国产aⅴ激情无码久久| 亚洲人成无码www久久久| 伊人久久一区二区三区无码| 精品一久久香蕉国产线看播放| 久久久九九有精品国产| 久久伊人精品青青草原高清| 好久久免费视频高清| 成人亚洲欧美久久久久 | 7777精品久久久大香线蕉| 亚洲综合久久夜AV | 伊人久久大香线蕉亚洲五月天| 亚洲欧美伊人久久综合一区二区 | 久久天天躁狠狠躁夜夜av浪潮 | 久久狠狠爱亚洲综合影院| 欧美伊人久久大香线蕉综合| 欧美一区二区三区久久综合| 国产精品久久久天天影视| 久久人人爽人人精品视频| 伊人久久大香线蕉综合5g| 精品久久久久香蕉网| 国产成人无码精品久久久免费| 色天使久久综合网天天| 欧洲精品久久久av无码电影 | 久久99精品国产99久久| 久久久久久久久久久免费精品 | 久久综合综合久久97色| 久久亚洲2019中文字幕| 色综合久久久久久久久五月| 国产成人精品久久亚洲高清不卡 | 午夜精品久久久久久久无码| 欧美熟妇另类久久久久久不卡| 国产精品99久久精品爆乳| 人妻久久久一区二区三区| 久久婷婷五月综合成人D啪| 国产精品国色综合久久| 久久这里的只有是精品23| 亚洲一本综合久久| 久久夜色精品国产欧美乱|