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

            戰(zhàn)魂小筑

            討論群:309800774 知乎關(guān)注:http://zhihu.com/people/sunicdavy 開源項(xiàng)目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評(píng)論 :: 0 Trackbacks

            #

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

            之后,發(fā)現(xiàn)每次即便每次完整編譯完成,開始調(diào)試時(shí),所有工程都會(huì)重復(fù)編譯一次,Clean后,再編譯,報(bào)了 一個(gè)vc90.pdb有關(guān)的C2859錯(cuò)誤.

            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

             

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

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

            posted @ 2010-05-21 17:17 戰(zhàn)魂小筑 閱讀(6055) | 評(píng)論 (0)編輯 收藏

            CEGUI的字符串類設(shè)計(jì)的初衷是以32個(gè)字符為分界點(diǎn), 低于32個(gè)字符使用固定buffer, 高于才使用棧分配內(nèi)存存儲(chǔ)字符串. 不過因?yàn)镃EGUI使用utf32,兼容性雖然很好,但是在VC調(diào)試器里無法顯示是個(gè)很大的問題.

            這里參考了mybios博客中的文章,給CEGUI字符串做一個(gè)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調(diào)試器中看到CEGUI字符串內(nèi)容, 不過中文還是暫時(shí)無法支持

            posted @ 2010-05-14 12:01 戰(zhàn)魂小筑 閱讀(1865) | 評(píng)論 (0)編輯 收藏

            要在游戲中用到強(qiáng)大而有擴(kuò)展性的骨骼動(dòng)畫,有很多注意點(diǎn).

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

            其次我們需要加強(qiáng)一個(gè)SubSkin的骨骼支持?jǐn)?shù)量. 骨骼動(dòng)畫上的每個(gè)SubSkin都是一次Draw, 但是按照傳統(tǒng)骨骼動(dòng)畫系統(tǒng),每個(gè)骨頭對(duì)應(yīng)一個(gè)矩陣傳入,那么SM2.0保守計(jì)算只能支持50根骨頭. 不過在我前段時(shí)間的文章中有提到這個(gè)技術(shù).并且已經(jīng)在我的骨骼動(dòng)畫系統(tǒng)及OGRE中實(shí)現(xiàn),效果很好.

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

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

            posted @ 2010-05-11 10:21 戰(zhàn)魂小筑 閱讀(2389) | 評(píng)論 (1)編輯 收藏

            在逛http://www.opengpu.org/index.php 時(shí)發(fā)現(xiàn)一個(gè)優(yōu)秀的ARPG客戶端引擎LingEngine

            各位可以下載看下

             

            image

            從直觀個(gè)人分析該引擎技術(shù)包括:

            1. 基于SlimDX的.NET引擎

            2. JavaScript腳本

            3. 場(chǎng)景剔除效率還不錯(cuò)

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

             

            博客里還有幾篇關(guān)于保留模式引擎的討論. 個(gè)人覺得這大概是以后的趨勢(shì). 微軟的WPF首先當(dāng)了炮灰, 慶幸.

            posted @ 2010-05-07 10:12 戰(zhàn)魂小筑 閱讀(2703) | 評(píng)論 (2)編輯 收藏

            首先參考SDK里這個(gè)函數(shù)的定義:

            HRESULT DrawIndexedPrimitiveUP(

            D3DPRIMITIVETYPE PrimitiveType,

            UINT MinVertexIndex,

            UINT NumVertices,

            UINT PrimitiveCount,

            CONST void * pIndexData,

            D3DFORMAT IndexDataFormat,

            CONST void* pVertexStreamZeroData,

            UINT VertexStreamZeroStride

            );

             

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

            MinVertexIndex = 0;

            NumVertices = 4;

            PrimitiveCount = 2;

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

            IndexDataFormat = D3DFMT_INDEX16

            pVertexStreamZeroData = { 4個(gè)角的位置 }

            VertexStreamZeroStride  = { 結(jié)構(gòu)體的跨度 }

             

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

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

            我們先看下怎么根據(jù)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在以后的驅(qū)動(dòng)中已經(jīng)不再使用,因此不再采用

            當(dāng)使用索引緩沖時(shí), VertexCount = IndexCount

            因此在上例中 PrimitiveCount = IndexCount/3

            也就是說 IndexCount = PrimitiveCount * 3

            代入PrimitiveCount = 2,因此 IndexCount = 6

             

            因此穩(wěn)定的API的函數(shù)參數(shù)設(shè)計(jì)是絕不會(huì)浪費(fèi)任何一個(gè)參數(shù)的

            posted @ 2010-05-05 17:07 戰(zhàn)魂小筑 閱讀(1578) | 評(píng)論 (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個(gè)ANSI字符內(nèi),調(diào)用這個(gè)函數(shù)后,將觸發(fā)一個(gè)調(diào)試器異常,VC調(diào)試器將會(huì)把字符串設(shè)置為線程名稱,并在調(diào)試器中顯示

            posted @ 2010-05-04 15:28 戰(zhàn)魂小筑 閱讀(1924) | 評(píng)論 (0)編輯 收藏

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

             

            回復(fù)于:2010-05-03 09:14:20

            請(qǐng)問樓主是用VC.net嗎? 中文版

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

            現(xiàn)在都是VS2010( VC10 ) 時(shí)代了, WPF已經(jīng)不是VC6能兼容的了

            看著某些童鞋,每天無止境的將標(biāo)準(zhǔn)C++代碼不斷翻譯成VC6only代碼, 為什么不把精力放在代碼設(shè)計(jì)上呢?

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

            我曾經(jīng)回復(fù)無數(shù)人的博客,解釋VC6的BUG. 這些童鞋居然一致堅(jiān)持說VC6簡(jiǎn)單.

            也許他們總是認(rèn)為: VC的代碼與二進(jìn)制在調(diào)試時(shí)不匹配, 數(shù)組越界等等問題,都是自己掌握語言不足而引起的.

            人與動(dòng)物最大的區(qū)別就是使用工具, 高效優(yōu)質(zhì)的工具提高工作效率

            posted @ 2010-05-03 18:01 戰(zhàn)魂小筑 閱讀(3830) | 評(píng)論 (23)編輯 收藏

                 摘要:   閱讀全文
            posted @ 2010-04-26 19:47 戰(zhàn)魂小筑 閱讀(15642) | 評(píng)論 (0)編輯 收藏

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

            float4x4 matBoneArray[40]; //  這是傳輸?shù)钠款i
             
            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這個(gè)數(shù)組是骨骼的LocalRot和LocalTranslation 通過以下函數(shù)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;
                }

            從這里你可以發(fā)現(xiàn), 本來每根骨頭只需要2個(gè)float4 傳遞變換信息的,現(xiàn)在卻需要4個(gè)float4,也就是一個(gè)矩陣來傳遞,矩陣中還有很多不使用的變量也被傳輸?shù)紾PU中,這里就是優(yōu)化的點(diǎn).

            重新調(diào)整后的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旋轉(zhuǎn)及偏移傳遞至GPU,然后在GPU內(nèi)重組,雖然對(duì)GPU性能計(jì)算有部分損耗,但是骨骼數(shù)量就能保守提高到100個(gè).

            posted @ 2010-04-26 13:31 戰(zhàn)魂小筑 閱讀(3656) | 評(píng)論 (7)編輯 收藏

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

            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;
                    }
            }

             

             

            這個(gè)函數(shù)會(huì)初始化所有鏈接到exe中的全局函數(shù)構(gòu)造, 跟蹤這個(gè)地方, 發(fā)現(xiàn),只有1個(gè)lib中的能被正確調(diào)用,但是出問題的那個(gè)lib中所有構(gòu)造都不能被調(diào)用. 嘗試調(diào)整編譯順序無果

            唯一的方法只有修改架構(gòu)為在winmain內(nèi)進(jìn)行構(gòu)造

            如果有這方面調(diào)試經(jīng)驗(yàn)的同學(xué)可以回帖,謝謝

            posted @ 2010-04-23 17:47 戰(zhàn)魂小筑 閱讀(1533) | 評(píng)論 (6)編輯 收藏

            僅列出標(biāo)題
            共26頁: First 13 14 15 16 17 18 19 20 21 Last 
            99久久精品国产毛片| 色欲久久久天天天综合网| 国产精品久久精品| 国产精品伦理久久久久久| 无码8090精品久久一区| 午夜精品久久久久久久| 久久精品国产精品国产精品污| 久久精品成人免费网站| 亚洲国产精品无码久久久久久曰| 人人狠狠综合久久亚洲| 久久综合综合久久综合| 久久www免费人成精品香蕉| 久久精品一本到99热免费| 国内精品久久人妻互换| 天堂无码久久综合东京热| 久久人人爽人人爽人人片AV不| 国产精品99久久精品爆乳| 亚洲国产精品久久电影欧美| 色综合久久久久| 国产精品99久久精品| 久久天天躁狠狠躁夜夜avapp| 色噜噜狠狠先锋影音久久| 少妇精品久久久一区二区三区 | 久久精品国产只有精品2020| 亚洲国产成人久久综合野外| 91精品观看91久久久久久| 久久精品中文字幕无码绿巨人| 久久无码AV一区二区三区| 久久精品无码一区二区日韩AV| 久久精品国内一区二区三区| 潮喷大喷水系列无码久久精品| 7777精品久久久大香线蕉| 日韩精品久久久久久久电影| 久久亚洲中文字幕精品一区| 久久精品一区二区影院| 精品久久久久久无码人妻蜜桃| 久久九色综合九色99伊人| 久久综合亚洲色HEZYO社区 | 久久这里都是精品| 久久亚洲精品国产亚洲老地址 | 久久久久99精品成人片试看|