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

            #

            很久沒有用WindowsAPI來讀取INI,在公司寫服務器邏輯需要用到,拿來試了下。

            記得很早以前就用過GetPrivateProfile*系的INI讀取函數,有一個問題很煩:ini的文件路徑必須是絕對路徑,否則即便工作路徑是設置正確的,也是無法讀取到ini文件。以前有查過,說是內部搜索路徑的問題。默認是在system32去找。4,5年前的處理方法就是把絕對路徑拿過來和當前路徑組合后傳給GetPrivateProfile*系API。

            之后,我自己一直是用自己封裝的文本解析類來讀取ini,很久沒碰這個API,也就沒有路徑煩惱

            今天再次碰到,故詢問了下其他人有沒有什么好的方法:

            只需要將路徑改為當前路徑標識即可,即:

            setting.ini   -->     ./setting.ini

             

            再次詛咒這個惡心的API

            posted @ 2010-09-02 10:11 戰魂小筑 閱讀(5299) | 評論 (6)編輯 收藏

             

            Actor - 一個可以放置在世界中或者在世界中產生的對象。這包括類似于Players(玩家)、Weapons(武器)、StaticMeshes(靜態網格物體)、Emitters(發射器)、 Infos以及 Sounds(聲效)等。

            ActorX - 是一個導出插件,它可以把骨架網格物體和動畫導入到一個可以導入到虛幻引擎中的文件內。

            Additive BSP(添加型BSP) - 添加到挖空型BSP空間中的BSP空間。 Additive BSP(添加型BSP) 是固體,是游戲環境中不可穿透的空間。

            AI - (人工智能)這個術語用于描述通過計算機控制的人物的行為和外觀。這可以包括簡單的不具有交互的腳本序列到復雜的學習玩家動作并進行調整的計算機人物。

            AI Controller(AI控制器) - 一個類,定義了一個計算機控制的人物或者一組計算機控制的人物的行為。

            Alpha Channel(Alpha通道) - 這是貼圖的一個額外通道,它不僅可以使貼圖處于透明狀態而且也可以使它處于半透明狀態。要想使用 Alpha Channel(Alpha通道) ,則必須設置貼圖的bAlphaTexture屬性為真。

            AmbientSound(環境聲效) - 它是一個Actors,當把它放置在關卡中時,它可以循環地從聲效瀏覽器中選擇聲效文件進行播放。

            Anim/Animation(動畫) -這是為您具有骨骼的3D模型創建的動作,它可以使3D模型在游戲中移動。 Animations(動畫) 存儲在.PSA文件中并且可以為一個單獨的骨架網格物體導入多個動畫。

            AnimNode(動畫節點) -是動畫樹中的一個單獨組件。許多不同類型的AnimNode(動畫節點)連接到一起來組成復雜的程序化的動畫混合。

            AnimTree(動畫樹) - 是應用到骨架網格物體上的動畫設置,包括多個動畫、混合以及骨架骨骼控制器。

            AnimTreeEditor(動畫樹編輯器) - 虛幻編輯器中的這個工具用于創建并預覽動畫樹。

            Beam Emitter(光束發射器) - 是一個獨立的發射器,它可以把貼圖拉伸為長的條帶,并且可以按照在虛幻編輯器中設計的方式來發射這些條帶。要獲得關于 Beam Emitters(光束發射器) 的更多信息,請參照 光束發射器參考頁面 。

            Blocking Volume(阻擋體積) -它是一個可以在編輯器中創建的體積,它可以阻擋玩家和其它actors但是它不阻擋零粗細跟蹤。要想獲得關于 Blocking Volumes(阻擋體積) 的更多信息,請參照碰撞參考文檔。

            Bot -一個計算機控制的玩家,它具有它自己的AI。

            Browser(瀏覽器) - 是一個標簽菜單,您可以使用它來查看編輯器的各個方面。要想獲得關于 Browsers(瀏覽器) 的更多信息,請參照Trash.虛幻編輯器用戶指南頁面。

            Brush(畫刷) - 它是使用在編輯器左側的 Brush(畫刷) 圖元工具創建的任何幾何體,包括那個紅色的構建畫刷。要想獲得關于 Brushes(畫刷) 的更多信息,請參照BSP畫刷指南?文檔。

            Build(構建) - 它是指編譯關卡,以便它可以執行所有必須要的預計算處理比如光照、路徑生成以及分解幾何體。也被稱為 Rebuilding(重新構建) 。

                      - 虛幻編輯器的版本。比如:UT2003使用引擎的2136 Build(版本) ,UT2004使用引擎的3186 Build(版本) 。虛幻引擎3是以經過QA驗證的版本進行發布的(發布信息)。要想獲得關于各種版本的虛幻引擎的信息,請參照虛幻技術開發路線圖文檔。

            Builder Brush(畫刷構建器) - 您可以使用紅色的畫刷來在關卡中挖空或者添加BSP體積。要想獲得關于 Builder Brush(畫刷構建器) 的更多信息,請參照使用BSP畫刷?頁面。

            BSP - 二叉空間分割樹(有時候指 CSG ) 是一個數據結構,用于組織關卡空間中的物體。雖然使用這個術語來指代幾何體從語義上講并不正確,但是因為它指向由畫刷構建器創建的幾何體,這樣便可以輕松地接受。要想獲得關于 BSP 的更多信息,請參照使用BSP畫刷?。

                  用更簡單的話說, BSP 是一種幾何體類型,您可以在關卡中添加或挖空幾何體來雕刻出環境空間。

            BSP Holes(BSP洞) - BSP幾何體中無法解釋的打斷,在那里挖空型BSP空間和添加型BSP空間彼此相交。它們發生在非常復雜的BSP添加/挖空中。它除了減慢場景的幀頻率外,我們已經發現它們會導致其它的一些奇怪的問題包括但不限于使靜態網格物體消失和不可間的阻擋玩家的墻壁。

            Camera(相機) -玩家在游戲中和虛幻編輯器中所看到的視圖。在正交視口中,您可以把正交視圖的相機看成眼睛。

            CollisionCylinder(碰撞圓柱體) - 每個actor周圍的圓柱空間,用于決定碰撞。對于大多數actors來說,這項設置默認情況下是關閉狀態,但是對于類似于player(玩家)和triggers(觸發器)這樣的actors, CollisionCylinder(碰撞圓柱體) 默認情況下處于打開狀態,它能檢測其它actor和它的碰撞。 CollisionCylinder(碰撞圓柱體) 的高度和半徑可以通過在了碰撞屬性標簽底下的屬性進行改變。

            Collision Model(碰撞模型) - 它們不是非常復雜的幾何體積,隨著靜態網格物體進行創建并保存在靜態網格物體中。 Collision Model(碰撞模型) 用于加速碰撞計算,而不是僅使用復雜的靜態網格物體進行計算。關于 Collision Modles(碰撞模型) 的更多信息,請參照碰撞參考文檔。

            Commandlet(命令開關) - Commandlet(命令開關)是一個您添加到您游戲的可執行文件上的可選參數用于執行各種動作或者輸出信息。請參照命令開關列表 和 制作命令開關頁面。

            Combiner(組合器) -一種材質類型,它把兩個貼圖或材質組合并混合它們成為一種新的材質。

            Console(控制臺) - (也成為 命令提示符、命令行)它是虛幻編輯器底部的一個文本域,允許您在編輯器中輸入控制臺命令。關于 Console(控制臺) 的更多信息,請參照控制臺命令文檔。

            CSG -構造實體幾何體(也稱為 CSG )這是BSP從語義上來說更加精確的屬于表示。術語 CSG 指使用構建畫刷創建的幾何體。關于 CSG 的更多信息,請參照使用BSP畫刷?文檔。

            Cubemap(立體貼圖) - Cubemap(立方體貼圖) 是創建具有反光性的材質的外觀所使用的環境貼圖所需要的。關于 Cubemaps(立方體貼圖) 的更多信息,請參照材質概要文檔。

            Cull(剔除) - 使某物體從渲染的物體中隱藏,或者換句話說,使渲染的物體不描畫某個東西。

            Decolayer(裝飾層) - 地形中的一個層,用于生成一組靜態網格物體的隨機樣式,這些樣式仍然附加到地形上并且它們的縮放值和方向可以基于每個靜態網格物體實例隨機地偏離。關于 Decolayers(裝飾層) 的更多信息,請參照 地形編輯器用戶指南文檔。

            Deintersect(反交集) - 這個動作將會保留在 負/挖空 空間中的畫刷構建器選項的剩余部分。關于使用 Deintersect(反交集) 按鈕的更多信息,請參照Trash.虛幻編輯器用戶指南文檔。

            Demiurge - 它是一個理想的工具,它可以從混沌中定制并制作材質。請參照Demiurge Studios頁面。

            Drag Grid(拖拽表格) - (也稱為 表格) 它是個切換開關,允許您把某些特定actors(比如靜態網格物體、Mover(移動者)以及畫刷)對齊到編輯器的網格上。 Drag Grid (拖拽網格) 的大小可以根據2的冪數進行調整,范圍從最低的1到最高的4096。關于 Drag Grid(拖拽網格) 的更多信息,請參照Trash.虛幻編輯器用戶指南文檔。

            DXTC - (也稱為 Trash.DirectX貼圖壓縮 )這是一種貼圖壓縮方法,它是虛幻編輯器中進行貼圖壓縮的主要算法。

            Emitter(發射器) - (也稱為 粒子系統)它是一個Actor,可以產生一系列的actors比如靜態網格物體和平面粒子來獲得各種各樣的特效。發射器可以相互結合使用來創建"粒子系統"。關于 Emitters(發射器) 的更多信息,請參照粒子系統參考文檔文檔。

            EnvMap(環境貼圖) - (也稱為 環境貼圖) 它是一種材質類型,可以用于創建具有反射光材質的外觀。關于 EnvMaps(環境貼圖) 的更多信息,請參照材質概要文檔。

            Event(事件) -一個調用函數,某些actors監聽它們,從而引起actors進行相應的動作。_Events(事件)_ 可以從觸發器、移動者、發射器以及代碼中進行調用。

            Face(面) - BSP物體的一側。一個 Face(面) 由兩個三角形組成。 

            FaceFX -它是一個集成到虛幻編輯器中的工具,允許您使得人物嘴唇的動畫和人物模型同步。關于這個插件的更多信息,請參照 FaceFX簡介文檔。

            FPS - (每秒中播放的幀數) 動畫視頻顯示圖片的速率的測量。電視運行大致在30 FPS ,電影通常運行在24 FPS ,然而游戲的 FPS. 通常是變化的。

                      - (First Person Shooter(第一人稱射擊)) 一種游戲類型,它從第一人稱的視角來描寫場景,并且和世界的主要交互是某種槍。

            Garbage collection(垃圾回收) -自動銷毀未被引用的對象(正如在Java、C#或者Three.UnrealScript中所存在的)。

            G16 -灰度圖16位圖片。地形的高度圖和alpha層使用 G16 位圖。

            Geometry(幾何體) - 它是指關卡中的由三角形構成的任何東西,比如Trash.靜態網格物體、BSP、地形等。

            Grid(網格) - See Drag Grid. 請參照拖拽網格。

            Group(組) - ( 組 瀏覽器) 通過使用 組瀏覽器 可以把Actors分配給一個 Group(組) 。這些 Group(組) 可以用于更好地可視化地管理這些使場景變的凌亂的各種不同actors。關于使用這些 組 的更多信息,請參照組瀏覽器參考文檔。

                      - (包 組 ) 組是對包中資源(比如 貼圖、靜態網格物體、以及聲效 包)的細分,允許您在瀏覽器中更加容易地管理資源。

            HOM(充滿鏡子的廳) - (Hall of Mirrors[充滿鏡子的廳]),它是一種效果。當渲染不能正確地重新描畫場景時便會創建一種混亂的視覺效果,其外觀和一個 充滿鏡子的大廳 類似。通過向關卡中的一個antiportal(阻擋體)或者穿過BSP洞看便會獲得這種效果。

            Impersonator -它是集成到虛幻引擎3中的一個工具,允許您使嘴唇的動畫同步到人物模型上。請參照FaceFX。

            Instance(實例) - a)任何類的對象;b)基于一個模板創建的子對象,包含在一個對象實例內。

            Intersect(交集) - 這個動作將僅留下構建畫刷和添加型BSP幾何體相疊加的部分。關于使用 Intersect(交集) 按鈕的更多信息,請參照編輯器按鈕文檔。

            Invisible(不可見) - BSP幾何體的表面屬性,它將導致不渲染標志為 不可見 的表面。然而,如果 不可見 的表面處于可見狀態,那么它們仍然可以發生碰撞。

            KActor - 一個可以移動的靜態網格物體,它使用物理引擎和其它具有真實物理的世界幾何體發生碰撞。KActors是單獨的剛體。

            KAsset - 關卡中的一個物理資源實例。KAsset使用物理來驅動骨架網格物體,這對于放置的布娃娃或者其它有很多剛體軀干和關節組成的帶皮膚的物體是有效的。

            Karma - 集成到虛幻引擎2的組成物理引擎的Math Engine(數學引擎)。虛幻引擎3使用Ageia(以前的Novodex)物理引擎。

            Keyframe(關鍵幀) - 動畫中或者mover(移動者)路徑中的一個姿勢,該姿勢可以對動畫運動或移動著的移動進行插值。

            Layers System(層次系統) - (Layers[層次]) 它是一種允許多個人同時在一張地圖上工作的機制。一個層次是一份地圖,它可以獨立于其它的層次地圖進行編輯。這個工作流程的一個例子便是,一個光照層次和一個幾何體層次,這允許兩個人在地圖的這些區域獨立地進行工作,不會產生相互的重疊。

            Level(關卡) - 關卡定義了一組actors和其它的可以被自動加載及卸載的復雜數據。虛幻引擎3中的世界可以有很多關卡組成;一個典型的游戲可以包含幾百個獨立的關卡。這些關卡可以基于接近度、精確的加載/卸載觸發器以及其它的標準來動態地被加載及卸載。關于關卡的更多信息,請參照創建關卡和關卡動態載入文檔。

            Light(光源) -在附近的表面上投射光線的actor。

            Light-map(光照貼圖) -虛幻引擎3使用這個技術來解碼投射到表面上的光照,包括光源入射光線的近似方向。

            Lightwave(光波) -它是第三方的建模程序,用于創建復雜的靜態網格物體和/或 骨架網格物體。

            LOD - (Level of Detail[關卡細節層次]) 這個功能允許幾何體的分辨率隨著距離降低,從而可以提高場景(尤其是帶動畫的人物)的幀頻率。關于如何使用模型上的 LOD 的更多信息,請參照靜態網格物體編輯器用戶指南文檔。

            Log(日志) -這個窗口打印出在游戲中或編輯器中發生的每個動作。

            Map(地圖) -這個保存的文件包含了放置在地圖中的所有actor的屬性以及您所創建的整個場景的布局。

            Masked(遮罩) -一個貼圖屬性,它使用alpha通道決定貼圖的一部分是透明的還是不透明的。 Masked(遮罩) 的貼圖沒有半透明。要想使用 Masked(遮罩) 設置,您必須把bMasked屬性設置為False。

            Material(材質) - 一個工具,用于使用貼圖創建特殊效果。_Materials_ 可以在貼圖瀏覽器中進行顯示和瀏覽,并且它們也被保存在貼圖包中。關于使用不同類型的 Materials(材質) 的更多信息,請參照貼圖和材質文檔。

            Matinee -編輯器中的一個關鍵幀工具,它允許您在游戲中移動物體并改變其屬性。您也可以在相機路徑及創建游戲中的鏡頭剪切時使用它。關于使用 Matinee 的更多信息,請參照Matinee用戶指南文檔。

            Max - (3DS Max) 一個第三方的建模程序,用于創建復雜的靜態網格物體 和/或 骨架網格物體。

            Maya - 一個第三方的建模程序,用于創建復雜的靜態網格物體 和/或 骨架網格物體。

            Mesh Emitter(網格物體發射器) - 一個獨立的發射器,可以按照在虛幻編輯器中設置的模式發射靜態網格物體。關于 Mesh Emitters(網格物體發射器) 的更多信息,請參照粒子系統參考文檔。

            Meshes(網格物體) - 它是在第三方程序中創建的模型,代表某個實體;術語 Mesh(網格物體) 通??梢院托g語 static mesh(靜態網格物體) 和 skeletal mesh(骨架網格物體) 替換地使用。

            Mod -用戶主要基于另一個商業游戲所創建的內容 (比如虛幻競技場),但是這個游戲已經被修改來創建不同的內容或者進行修改來創建不同游戲性體驗。

            Modifier(修改器) -一個材質可以使用各種方式來修改一個貼圖或者另一個材質,這些方式包括(但不限于)平移、起浮、旋轉和縮放。

            Mover(移動者) -一個特殊的靜態網格物體,可以在編輯器中對其設置關鍵幀,然后當類似于玩家碰撞、武器開火或者觸發器這樣的事件觸發時,使得該靜態網格物體沿著這些關鍵幀定義的路徑移動。

            Music(音樂) -歌曲文件,可以被添加到關卡中,使它在背景中播放或者當觸發一個事件后播放這個歌曲。這些歌曲文件必須是.ogg文件格式。

            NonZeroExtentTraces(非零粗細跟蹤) -它是跟蹤方式,使用沿著直線運行的盒子來決定碰撞。換句話說,如果兩個點之間可以連線,它不再使用投射的2維的線來決定碰撞,而是使用沿著線投射的三維的盒子來檢測什么東西會組織盒子。

            Notifies(通知) -一個調用函數,可以放置在給定動畫的任何地方,可以觸發另一個事件包括但不限于產生聲音、粒子系統或者可執行的UnrealScript函數。在一個走動動畫中,當腳部接觸地面是所播放的腳步聲是 Notifies(通知) 的一個很好的例子。

            Novodex - 這是虛幻引擎3中所使用的剛體物理引擎,用于模擬物體間的真實的運動和碰撞。Novodex也用于UE3的車輛系統。Novodex歸Ageia所有,它們的網站是http://www.ageia.com。

            Outer(外部容器) - 對于存儲在包中的物體,該物體的外部容器通常是它們所在的組或包。對于存儲在關卡中的物體,它們的外部容器是關卡。

            Order(順序) - 排序

            P8 - 8位palletized貼圖。

            Package(包) -高層次的數據結構,用作為UObjects的容器。所有包含在一個包中的UObjects將會把那個包作為它的外部容器屬性的值。

            Particle System(粒子系統) -請參照發射器。

            Particle Emitter(粒子發射器) - 粒子系統中的一種獨立類型的發射器(比如 Beam Emitter(光束發射器)、 Mesh Emitter(網格物體發射器)、Spark Emitter(火花發射器) 或 Sprite Emitter(平面粒子發射器) )。

            Pass(遍數) - 場景在著色器中被描畫一次為一Pass(遍) 。一個場景在被描畫出來之前可以要求著色其渲染多 Passes(遍) 。換句話說,如果一個三角形要求渲染3遍,那么它將被著色器描畫三次。

            Path Node(路徑節點) - 它是由很多線組成的網絡中的一個點,它決定了bot可以運行到的位置。在編輯器中 Path Nodes(路徑節點) 呈現為蘋果。關于 Path Nodes(路徑節點) 的更多信息,請參照NavigationAI(導航AI)文檔。

            Pawn -一個人物或者類,它可以在整個關卡中到處運動(或者靠它自己或者由玩家控制)。

            PhAT - 物理資源工具,它是編輯器的一部分,用于創建PhysicsAssets(物理資源)。PhAT允許您取入一個網格物體,然后把碰撞模型和關節分配給骨骼。它也允許您實時地預覽物理設置,并和它進行交互。您參照 Trash.物理資源工具文檔獲得關于PhAT的更多內容。

            PhysicsAsset(物理資源) -一組碰撞形狀和關節設置組成了關于骨架網格物體的物理信息。比如,布娃娃(ragdoll)的設置,您也可以使用PhysicsAssets(物理資源)來展示任何具有關節的物體的物理。PhysicsAssets(物理資源)也可以用于更新骨架網格物體的包圍盒,以及基于每個骨骼的碰撞檢測。PhAT是用于創建物理資源的一個工具。

            PhysX -集成到虛幻引擎3中的Ageia(以前的Novodex)物理引擎。

            Play Map(播放地圖) - 當最終用戶正在運行地圖時實時地運行關卡。

            Player(玩家) - 當地圖在實時地運行時,使用地圖的人類用戶。

            PlayerStart -玩家的pawn或bot在關卡中的產生點。

            Portal(入口) - (也稱為 Zone Portal(區域入口) ) 特殊化刷的一種特定類型,通常以薄片的形式出現,它可以把一個區域分為兩個不同的區域。關于

            Poly(多邊形) - (也稱為 Polygon(多邊形) )一個三角形。

            Primitive(圖元) -一個標準的、不可改變的BSP圖形,可以使用編輯器左側的這些工具進行創建(也就是曲線樓梯、圓柱體、圓錐、薄片等)。關于 Primitives(圖元) 的更多信息,請參照Trash.用戶指南頁面。

            Projector(投射器) -它是一個actor,可以在場景中以各種類型幾何體投射貼圖。

            Properties(屬性) -任何actor或貼圖的設置。要想訪問actor的 Properties(屬性) ,只要簡單地按下F4鍵或者右擊actor即可。

            Quad(方形) - 兩個三角形組成一個方形,在線框模式下的地圖中很容易看到它。

            Ragdoll(布娃娃) - 應用到人物模型上的真實地物理仿真,這可以使的人物像布娃娃那樣進行動作。

            Rebuild(重新構建) -請參照Build(構建)。

            Refpose(參考姿勢) - ( Reference Pose )一個帶動畫的任務在進行動畫之前所處的默認姿勢(通常是直立姿勢)

            Renderer(著色器) -虛幻引擎的一部分,它是真正地把玩家看在場景中看到的東西描畫出來的工具。

            RGBA8 -一個紅藍綠8位圖片。

            Root(根骨骼) - 在骨架動畫層次中的最頂部的主要骨骼。當人物在關卡中運行時, Root(根骨骼) 會不斷地平移 和/或旋轉。

            Rotation Gizmo(旋轉小工具) - 一個用于旋轉和平移actors的界面。

            Rotation Grid(旋轉網格) - 這個切換開關允許您以離散的時間間隔圍繞著支點旋轉actors。

            Runtime(實時) -這個模式是指當關卡正在真正地運行時您可以作為玩家和關卡世界進行交互。

            Seamless Worlds(無縫的世界) -無縫世界系統的目標是動態地加載背景或者卸載和關卡相關的復雜數據。這個功能和動態載入協同工作,以便所有和世界相關的數據都可以動態地加載。

            Script(腳本) - 請參照 Unreal Script。

            Shadow depth buffer(陰影深度緩沖) -這是一種渲染軟邊動態陰影的技術。虛幻引擎3使用陰影深度緩沖來渲染靜態光源下的動態物體所投射的陰影。

            Shadow-map(陰影貼圖) - 一個貼圖或基于每個頂點的蒙板,它存儲著網格物體或者BSP表面上每個點的特定光源的預計算陰影。

            Shadow volume(陰影體積) - 一種渲染硬邊動態陰影的技術。虛幻引擎3使用陰影體積渲染動態光源投射的陰影。

            Shape Editor(圖形編輯器) - (也成為 2D 圖形編輯器 ) A tool in the Unreal Editor that allows one to create unique BSP brushes. 虛幻編輯器中的一個工具,允許您常見特殊的BSP畫刷。

            Sheet(薄片) -創建ZonePortals(區域入口)通常使用的2D畫刷。

            SimpleBoxCollision(簡化的盒式碰撞) - 一種靜態網格物體碰撞類型,它使用NonZeroExtentTraces(非零粗細跟蹤)來計算碰撞。關于_SimpleBoxCollision(簡化的盒式碰撞)_ 的更多信息,請參照碰撞參考文檔。

            SimpleRigidBodyCollision(簡單的剛體碰撞) -一種靜態網格物體碰撞類型,它使用Hulls(外殼)來計算剛體的碰撞。關于 SimpleRigidBodyCollision(簡單的剛體碰撞) 的更多信息,請參照碰撞參考文檔。

            SimpleLineCollision(簡化的線性碰撞) -一種靜態網格物體碰撞類型,它使用ZeroExtentTraces(零粗細跟蹤)來計算碰撞。關于 SimpleLineCollision(簡化的線性碰撞) 的更多信息,請參照碰撞參考文檔。

            Skeletal Mesh(骨架網格物體) - 這個網格物體可以使用在第三方建模程序中所創建的骨架和動畫來使得骨架網格物體產生動畫。關于 Skeletal Mesh(骨架網格物體) 設置的更多信息,請參照導入骨架網格物體指南頁面。

            Skeleton(骨架) -在第三方建模程序中為帶動畫的人物所設立的骨骼。

            Skin(皮膚) - 應用到網格物體(靜態網格物體、骨架網格物體等)上的貼圖。

            Skins Array(皮膚數組) -屬性窗口中的一個文本域,允許您在一個模型上切換不同的皮膚或貼圖。

            Sky Dome(天幕) -一個大的半球形靜態網格物體,可以用于創建遠處天空的假象。請參照SkyZone(天空區域)。

            Snap(對齊) - (指的是網格 Snap(對齊) )當它移動或旋轉時,這個功能把幾何體對齊到網格上。

            Socket(插槽) -它是骨架網格物體的骨骼上的指定的附加點。關于設立和使用插槽的信息請參照SkeletalMeshSockets(骨架網格物體)插槽文檔。

            Sorting(排序) -選擇著色器先描畫什么的順序和層次。

            Special Brush(特殊畫刷) -它是一個畫刷,可以通過使用 Add Special Brush(添加特殊畫刷) 按鈕來添加,這不僅為您提供了可能的默認 Special Brushes(特殊畫刷) 下拉列表選項,也允許您自定義一個唯一的 Special Brush(特殊畫刷) 。關于 Specail Brushes(特殊畫刷) 的更多信息,請參照Trash.虛幻編輯器用戶指南文檔。

            Sprite(平面粒子) -應用到平面上的一個貼圖(通常和粒子系統一同使用)。

            Sprite Emitter(平面粒子發射器) -一個獨立的發射器,它可以按照在虛幻編輯器中定義的方式發射平面粒子。關于 Sprite Emitters(平面粒子發射器) 的更多信息,請參照粒子系統參考文檔。

            StaticMesh(靜態網格物體) - (也稱為 _Static Mesh(靜態網格物體) _ )它是在第三方程序中創建的模型,當把它添加到地圖中時,它仍然保持固定性。

            Streaming(動態載入) - (也稱為 Content Streaming[內容動態載入])這種機制允許您根據需要從源媒體中加載大量的游戲和場景信息。這對于那些不能一次在內存里存儲整個場景的控制臺游戲平臺和其它機器是有利的。關卡、貼圖和其它類型的數據也可以進行動態載入。

            Subobject(子對象) - 一個對象中包含另一個對象,(除了UObjects包含在包)中意外。一般通過使用Begin Object/End Object'語法把子對象聲明在類的.u文件的默認屬性中。

            Subtractive BSP(挖空型BSP) -從固體 和/或 添加型世界空間中挖出的BSP空間。 Subtractive BSP(挖空型BSP) 是關卡中的一個開發空間,玩家可以在它的內部到處走動。請參照BSP。

            Surface(表面) - BSP的可見貼圖。

            Surface Properties(表面屬性) -可以分配給BSP表面的屬性。關于 Surface Properties(表面屬性) 的更多信息,請參照 Trash.虛幻編輯器用戶指南文檔。

            Tag(標簽) -世界中的一個特定actor在它的屬性窗口中的事件標簽下所賦予該actor的名稱。

            Targa - 虛幻引擎可以導入的一種貼圖文件的格式。

            Teleporter(電傳) -它是一個actor,它可以立即地把玩家從地圖的一個點發送到地圖的另一個點或者甚至是另一張地圖中的某個點。

            Template(模板) - 包含在一個類的默認對象中的子對象。

            Terrain(地形) - (也稱為 TerrainInfo(地形信息) )一種幾何體類型,它以一種高度多邊形細分的片,并且可以使用虛幻編輯器中的 Terrain Editor(地形編輯器) 工具使它發生變形以及對其進行雕刻。關于使用 Terrain(地形) 的更多信息,請參照地形編輯器用戶指南頁面。

            Terrain Layer(地形層次) -地形的分級層次,可以在這些層次上描畫貼圖并把它們在地形上進行混合。關于 Layers(層次) 的更多信息,請參照設置地形文檔。

            Texture - 一個可以分配給世界中的幾何體的圖片文件。材質有時也被指為 Textures(貼圖) 。關于 Textures(貼圖) 的更多信息,請參照貼圖和材質文檔。

            Trace(蹤跡) - 從一個點到另一個點(比如從一個槍支到目標)之間的一條連線(僅用于計算目的),它可以用于決定碰撞。

            Triangle(三角形) - 最小的可渲染的世界幾何體構建塊,場景中的任何東西都是基于這些三角形進行構建的。

            Trigger(觸發器) - 一個actor,它可以在游戲播放過程中觸發一個事件。

            Umod - (也稱為 Unreal MOD(虛幻MOD) )這是一個平臺獨立的文檔服務器,它允許mod創建者把它們的游戲內容發布給虛幻引擎游戲玩家。(僅虛幻引擎1和虛幻引擎2)。

            UnEdit - 這是為虛幻引擎2授權用戶提供的郵件列表,它作為虛幻引擎內容創建和虛幻編輯器應用的支持組提供。

            UnEdit3 - 這是為虛幻引擎3授權用戶提供的郵件列表,它作為虛幻引擎內容創建和虛幻編輯器應用的支持組提供。關于 UnEdit 的更多信息,請參照UnEdit3文檔。

            Unreal Developer Network(虛幻開發者網絡) - (也稱為 UDN )這個團隊為虛幻引擎3的授權用戶提供支持。關于 Unreal Developer Network(虛幻開發者網絡) 的更多信息,請參照Main.WebHome頁面。

            UnrealEd - (也稱為 Unreal Editor(虛幻編輯器) )這個編輯工具允許您創建可播放的交互式的世界。

            UnrealScript -它是Unreal本身具有的一個編程語言,它可以用于為AI和游戲事件創建腳本序列(一系列的動作)。

            URU - (也稱為 Unreal Rotation Unit(虛幻旋轉單位); Unreal Unit(虛幻單位)) 虛幻編輯器中用于度量距離和旋轉量的單位。注意虛幻引擎的旋轉單位 16384 = 90? 。

            UT - (也稱為 Unreal Tournament(虛幻競技場))使用虛幻引擎的第一代版本發行的一個游戲。要想查看第一代虛幻引擎版本發行的其它游戲,請參照 FirstGenerationTitles(第一代游戲)文檔。

            UT2003 - (也稱為 虛幻競技場2003)這是基于虛幻引擎2110版本上進行了很多修改后發行的版本。關于 UT2003 的更多信息,請參照Powered.UnrealTournament2003(虛幻競技場2003)頁面。

            Vertex(頂點) - (復數 Vertices(頂點) )幾何三角形的一個點。

            Vertex Color(頂點顏色) -一種基于頂點添加顏色來對幾何體進行著色的技術。

            Viewport(視口) -虛幻編輯器的一個顯示窗口,它可以顯示前視口、側視口、頂視口和透視口。

            Volume(體積) -一個三維空間,它可以影響各種游戲性功能,比如移動、可見性和玩家損害。

            WarpZone(電傳區域) - 一個特殊的區域,它包含著WarpZoneInfo信息,該信息可以使得玩家從一個 WarpZone 立即運行到另一個相應的 WarpZone 。

            Wiki - 一個網頁格式的系統,它允許進行容易的快速的在線維護。UDN網站是基于 Wiki 的。

            Wiki wiki - 夏威夷語的意思是 快速的 。

            World(世界) - (參照 Map(地圖)、Levels(關卡))這個構造組成了游戲中的整個場景。虛幻引擎3中的世界可以由很多較小的已知關卡進行構建,世界存儲在地圖文件中。

            Zone(區域) -為了優化目的,關卡中的區域都使用入口進行了區域劃分。

            ZoneInfo(區域信息) -它是一個actor,允許您改變它所在區域的屬性。

            ZBuffer - 顯卡中的某段視頻內存,它跟蹤可以看到的和隱藏在其它物體后面的場景元素。

            ZeroExtentTraces(零粗細跟蹤) -一個跟蹤,它使用從源到目標之間的一維的線來決定碰撞。

            ZFight- 一種閃動的視覺失真現象,當兩個表面或者占用同一個平面或者它們接近于占用同一個平面和空間時,在那里可以顯示的貼圖看上去就像在“打斗”一樣來獲得顯示權。

            Zone Portal(區域入口) -請參照入口。

             

            轉載自http://www.udkcn.com/bbs/viewthread.php?tid=114&extra=&page=1

            posted @ 2010-08-05 10:22 戰魂小筑 閱讀(2911) | 評論 (0)編輯 收藏

             Google上個月Https搜索轉到另外一個域名encrypted.google.com下面,所有的https搜索都會自動重定向,Google稱這個操作是為了方便美國學校和企業過濾新的域名,但當時我就知道,這個域名危險了。

              整整一個月后的今天,終于還是等到了這一天,雖然對于沒做任何設置的中國用戶,Google默認會把https搜索重定向到谷歌香港的http搜索,盡量避免中國用戶使用HTTPS搜索,但這一天終于還是來了,Google的HTTPS加密搜索服務器域名 encrypted.google.com 被DNS污染而無法訪問。

              關于判斷DNS污染的文章可以參看此文,我們在命令行下通過這樣一條命令 nslookup encrypted.google.com 144.223.234.234,即可判斷該域名是否被污染,由于144.223.234.234不存在,理應沒有任何返回。但我們卻得到了一個錯誤的IP:93.46.8.89。可見 encrypted.google.com 這個域名已經被DNS污染了。

              解決的方法有三個:

              1、使用各種SSH加密代理,在加密代理里進行遠程DNS解析,或者使用VPN上網。

              2、修改hosts文件,Windows系統中Hosts文件的優先級高于DNS服務器,操作系統在訪問某個域名時,會先檢測HOSTS文件,然后再查詢DNS服務器??梢栽趆osts添加受到污染的DNS地址來解決DNS污染和DNS劫持,目前可用的encrypted.google.com的IP有66.249.89.104和209.85.225.104。

              3、通過一些軟件編程處理,可以直接忽略返回結果是虛假IP地址的數據包,直接解決DNS污染的問題。這類軟件可參見這里這里。

             

            轉載自月光博客 [ http://www.williamlong.info/ ]

            posted @ 2010-07-30 09:51 戰魂小筑 閱讀(1823) | 評論 (0)編輯 收藏

            C++的界面庫經過幾天來的搜索,總結了下面幾種的優缺點

            1. MFC

               優點:VS2008以及VS2010的擴展確實很強大,特別是原生的窗口運行時停靠以及PropertyGrid確實很強大

               缺點:默認字體很模糊,無論你對MFC多了解,C++多熟悉,每次寫代碼時依然要重新熟悉代碼,更不用提分析別人寫的MFC代碼,一個字:亂。

            2. WTL

               優點:Windows下有個最好的例子:Google Chrome

               缺點:缺乏設計器,文檔例子很少

            3. wxWidgets

               優點:虛幻3編輯器在用(不是廣告),wxAUI的布局設計器很方便,Windows原生界面很舒服,各種功能封裝都很到位。

               缺點:布局沒有類似GTK+的Fixed絕對坐標方式(Windows SDK默認的左上角像素定位方式),在某些界面顯得設計麻煩。 動態鏈接庫多的嚇人,工程過于臃腫。

            4. Qt, GTK+

                據說Windows下不是很好用。

            5. DirectUI

                有很多個人封裝類似功能的庫。界面,代碼分離, 但99%都是收費

            6. C# Windows Form

                這是很好的選擇,語言方面可以用C++/CLI 免得轉換語言

               自由??抗δ芸梢允褂肳eiFenLuo.winFormsUI.Docking 非常簡單

            7. WPF

               有童鞋已經使用MFC/C++通過加載XML顯示界面,不過通過資料顯示,WPF的控件很少,甚至連原生的PropertyGrid都沒有,設計器倒是很華麗

             

            總結:界面庫的選擇最重要的一點就是看有沒有很好的設計器,這個是高效開發的重中之重。我尊重MFC,敬仰MFC,它作為C++的框架庫來說很不錯,但是對于界面設計還是過老了。我們開發的是產品,出的是程序,而不是研究MFC,怎樣用好MFC。

            posted @ 2010-07-28 17:22 戰魂小筑 閱讀(25106) | 評論 (28)編輯 收藏

            偶然一次查看RenderMonkey例子中的Particle System.rfx 的 FireParticleSystem 中發現了一種提高DX9渲染效率的設計方法

            image

            這里僅列出Vertex Shader參考:

             

               1:  float4x4 view_proj_matrix: register(c0);
               2:  float4x4 view_matrix: register(c4);
               3:  float time_0_X: register(c8);
               4:  float4 particleSystemPosition: register(c9);
               5:  float particleSystemShape: register(c10);
               6:  float particleSpread: register(c11);
               7:  float particleSpeed: register(c12);
               8:  float particleSystemHeight: register(c13);
               9:  float particleSize: register(c14);
              10:  // The model for the particle system consists of a hundred quads.
              11:  // These quads are simple (-1,-1) to (1,1) quads where each quad
              12:  // has a z ranging from 0 to 1. The z will be used to differenciate
              13:  // between different particles
              14:   
              15:  struct VS_OUTPUT {
              16:     float4 Pos: POSITION;
              17:     float2 texCoord: TEXCOORD0;
              18:     float color: TEXCOORD1;
              19:  };
              20:   
              21:  VS_OUTPUT main(float4 Pos: POSITION){
              22:     VS_OUTPUT Out;
              23:   
              24:     // Loop particles
              25:     float t = frac(Pos.z + particleSpeed * time_0_X);
              26:     // Determine the shape of the system
              27:     float s = pow(t, particleSystemShape);
              28:   
              29:     float3 pos;
              30:     // Spread particles in a semi-random fashion
              31:     pos.x = particleSpread * s * cos(62 * Pos.z);
              32:     pos.z = particleSpread * s * sin(163 * Pos.z);
              33:     // Particles goes up
              34:     pos.y = particleSystemHeight * t;
              35:   
              36:     // Billboard the quads.
              37:     // The view matrix gives us our right and up vectors.
              38:     pos += particleSize * (Pos.x * view_matrix[0] + Pos.y * view_matrix[1]);
              39:     // And put the system into place
              40:     pos += particleSystemPosition;
              41:   
              42:     Out.Pos = mul(view_proj_matrix, float4(pos, 1));
              43:     Out.texCoord = Pos.xy;
              44:     Out.color = 1 - t;
              45:   
              46:     return Out;
              47:  }

            由于RenderMonkey本身只能使用Shader,而不能進行任何CPU方的算法設計,因此要實現一個例子系統,只能使用另外的方法,這個例子就是使用純Shader來實現了一個粒子系統的效果。

            注意第31,32行中出現的Pos.z,這是本例子最有參考價值的地方。如果把Particles這個模型引用的QuadArray.3ds用MAX打開你就能發現,這其實是一個多層疊出來的片, 每個片的間隔就是Pos.z。讓我們來整理下渲染出例子的整個流程:

            由QuadArray.3ds提供Vertex數據,也就是VertexBuffer.片狀的VB數據被送入管線,然后由上面的VertexShader程序,通過Pos.z將他們切開,控制這些片的頂點重塑例子的外觀。最后的PS只是簡單的將光柵化后的像素點根據紋理采樣顯示出來。

            2008年時,我曾經根據這個原理,設計了一套粒子系統,原理與這個差不多,只不過VB是由Constant設置進來,在DX10/11以上就叫ConstantBuffer。測試了下,傳統的粒子系統,在我的本子上大約只能跑60多幀,但是這個不鎖定VB的粒子系統卻可以跑300多幀。

            最近決定使用這個技術優化下我的引擎中繪制線段及片的系統,以下是VertexShader的代碼:

            #define VERTEX_COUNT 80
             
            float4 PositionBuffer[VERTEX_COUNT];
            float2 UVBuffer[VERTEX_COUNT];
            float4 ColorBuffer[VERTEX_COUNT];
             
            float4x4 Transform;
             
            void Main(
                in float InIndex : TEXCOORD0,
                out float4 OutPosition : POSITION,
                out float2 OutTexCoord : TEXCOORD1,
                out float4 OutColor : COLOR0
                )
            {
                OutPosition = mul( PositionBuffer[ InIndex ] , Transform );
                OutColor = ColorBuffer[ InIndex ];
                OutTexCoord = UVBuffer[ InIndex ];
            }

            這里有個細節需要注意。從最初分析看來,多邊形的構造都是由Constant輸入,并由VS代碼構造,在VB中的數據好像只需要一個Index就夠了。但是實際測試下來發現,這樣是錯誤的,還是必須在頂點定義中添加繪制的基本元素,例如位置和紋理坐標。

            DX9因為不開源,我們并不了解下面3種繪制方式的性能差異:

            1. Constant發送

            2. 鎖定VB發送

            3. DrawPrimitiveUP系列使用系統內建緩沖渲染

             

            經過測試發現,DrawPrimitive在數據量小時,比鎖定VB快些,而Constant發送方式沒有DrawPrimitiveUP快。

            因此,使用Constant發送多邊形數據進行構造的方法在量小且固定的情況下對于性能提升是很有幫助的,但大量的頂點及變化的數據還是必須使用傳統的方法。

            posted @ 2010-07-27 14:46 戰魂小筑 閱讀(2240) | 評論 (1)編輯 收藏

            虛幻中的材質系統集合了節點代碼生成,shader參數綁定及設置,渲染狀態管理等多種功能。UDK中使用的是2個資源類型Material和MaterialInstance,他們都可以賦予任何對象。但同時,他們的用途也是有區別的

            Material更接近于傳統我們見過的材質,可以使用MaterialEditor進行節點編輯生成一種材質,設置各種參數,直接在編輯器中綁定使用的紋理,并將Material賦予對象

            MaterialInstance的原理有點類似于C++的虛表,這點可以從材質實例編輯器中看得出來

            image

            當前的既是MaterialInstance,其父就是Material,這種層次可以是多層的

            Material在添加節點時有一種帶有Parameter的節點例如

            TextureSample是普通的材質采樣器

            TextureSampleParameter2D就是可以共享出來給外部設置的參數,換句話說,就是這個采樣器可以在后期修改。

            MaterialInstance就是可以修改這些Parameter。

            通過這種結構的設置,我們就可以輕易的使用1種樣式的材質效果,通過更換局部效果圖片,變換組合出更多的效果。

            posted @ 2010-07-16 09:59 戰魂小筑 閱讀(2566) | 評論 (4)編輯 收藏

            參考了下OGRE的靜態模型策略,分析出兩種:

            第一種就是我們常見的n個靜態模型使用n個VB渲染n次,這種方法適用于變換矩陣總是要變化的靜態模型繪制,比如說月球圍繞地球。

            第二種有點類似于LineBatcher的概念,靜態模型管理器將所有在編的靜態模型,按照材質分組,每個材質1個VB大緩沖,然后將所有的Mesh頂點乘上其變換矩陣變換為世界坐標系后塞入VB,繪制1次。這種方法在同材質,大量靜態物體時很高效,可以說是用空間換時間,具體應用如:草原上的一片一片的草。 重建的時機為:有模型創建,銷毀,或者矩陣,材質有變化時。

            OGRE中利用了Entity和SceneNode來給模型管理器提供一個遍歷整理數據的流程。默認的,都是使用第一種方法渲染。

            原本最簡單的靜態模型渲染,在追求效率的要求下,變得比骨骼動畫都還復雜。

            posted @ 2010-07-08 16:18 戰魂小筑 閱讀(1960) | 評論 (1)編輯 收藏

            image

             

            終于完成了結構最復雜的Shader管理器,特性如下:

            GlobalShader管理:

            也就是傳統的手寫Shader,完成特殊的任務,例如線條繪制,2D繪制等等

                class ElementPixelShader : public ShaderBinder
                {
                    DECLARE_RTTIOBJECT( ElementPixelShader )
                    DECLARE_RTTISERIAL( ElementPixelShader )
                    DECLARE_SHADER_METAINFO(ST_PixelShader, L"Shader\\SimpleElementPixelShader.usf",L"Main")
             
                public:
             
                    virtual void BindShaderParameter( eShaderType ShaderType, const ShaderParameterMap& ParameterMap )
                    {
                        mTexture.Bind( ParameterMap, "Texture" );
                    }
             
                    void SetTexture( RenderTexture* NewTexture )
                    {
                        mShaderRHI->SetTextureParameter( mTexture, NewTexture );
                    }
             
                    virtual void Serialize( BinarySerializer& Ser )
                    {
                        __super::Serialize( Ser );
             
                        Ser << mTexture;
                    }
             
                private:
                    ShaderParameter mTexture;
                };
             
                IMPLEMENT_GLOBAL_SHADER( ElementPixelShader, 1);

            管理器中,是一種類似單件存儲,通過類型可以直接取到實例

            MaterialPixelShader管理

            這種Shader通過材質節點生成的shader代碼來記錄每個Shader信息,每個MaterialVertexShader需要只做MaterialPixelShader需要的信息并在Shader代碼中傳送給它

            MaterialVertexShader管理

            這類Shader最復雜,其中的控制代碼生成的宏需要由材質提供,例如是否使用TangentSpace。還有一些參數就更頭疼了, 不是材質在制作時能決定的,例如:一個材質可以應用給地形,模型,甚至粒子,所以我把這部分參數叫做晚綁定參數(Later Bind Material Parameter)

            MaterialVertexShader本身是抽象的,需要在材質應用到具體對象時,由對象提供其特殊的VertexShader處理Shader,同時根據特性設定晚綁定參數

             

            晚綁定參數:

              MaterialParameter Parameter;
              Parameter.Set( MPT_UseSkin, mSkinned );
              mMaterialInstance->SetVertexShaderProvider( RTTI_CLASS_INFO( ModelMaterialVertexShader),Parameter );

             

            材質緩沖系統

            Shader 動態編譯在很多游戲里都有應用,例如:戰地2。游戲第一次啟動時,就會編譯一次Shader。按照很多文章說的,編譯器會根據你顯卡及配置編譯出最優化的代碼。 我就納悶了, D3D編譯函數根本沒有傳入設備句柄,怎么可能根據機器配置編譯?我也嘗試過,不同機器上編譯出來根本就是一樣的。

            在以后引擎啟動時,Shader系統就會自動從保存好的緩沖內讀取,不用再次編譯。

            這里還要提一個微軟為D3DX做的升級Patch系統很惡心,類似于D3DXCompileShader及Shader相關的函數,在每次調用函數時,會載入一個D3DX9_xx.dll,調用完畢后又會卸載,極大的影響性能。 若不是因為這個,估計我不會寫緩沖系統的

            動態編譯更新Shader

            這個功能是很多引擎都有的,RenderMonkey也一樣,實現起來很簡單,就是一個文件時間戳比較問題,此功能完全是為以后編輯器做準備。

             

            MaterialShader部分終于告一段落,下面終于可以進入材質節點系統的進一步完善了

            posted @ 2010-07-02 15:28 戰魂小筑 閱讀(2296) | 評論 (1)編輯 收藏

            我的節點材質系統已經基本搭建完畢,ShaderFX和虛幻UDK給于了極大的啟發與支持,感謝感謝

            以下效果圖是骨骼動畫的各通道效果圖

            O)4)_]QB8BQO`@NL1C{C6K7Ambient Map

            ~MCHE$KW9QM0KIMC4XDB(LTDiffuse Map

            M%O$B~{J24G1[12[TTY2TEKSpecular Map

             

            節點暫時還是用C++構造的,之后會改為二進制存儲

                    MaterialCompiler Compiler;
             
                    MaterialNodeTextureSampler SamplerNode(&Compiler);
             
                    /*MaterialNodeVector VectorNode(&Compiler);
                    VectorNode.mData = Vector4( 1,1,0,0);*/
             
                    MaterialNodeAdd AddNode(&Compiler);
                    MaterialNodePointLight PointLightNode(&Compiler);
             
                    
                    //VectorNode.mRGB.LinkTo( &AddNode.mDataX );
                    //SamplerNode.mRGB.LinkTo( &AddNode.mDataY );
             
                    SamplerNode.mRGB.LinkTo( &PointLightNode.mAmbient );
             
             
                    //AddNode.mResult.LinkTo( &PointLightNode.mDiffuse );
             
                    if ( Compiler.GetErrorCount() == 0 )
                    {    
                        PointLightNode.Compile();
                        Compiler.SaveCode( StringConverter().AnsiToUnicode( mShaderFile.c_str() ) );
                    }
            生成的代碼格式和虛幻的shader模板一摸一樣,不過我的利用了點不定參數列表的小技巧,代碼更漂亮的,呵呵
             
                MaterialNodePointLight::MaterialNodePointLight(MaterialCompiler* Compiler)
                    : MaterialNode( Compiler )
                {
                    mAmbient    .BindSlot( L"Ambient",        this, MVT_Float3, "float3(0.0f,0.0f,0.0f)" );
                    mDiffuse    .BindSlot( L"Diffuse",        this, MVT_Float3, "float3(0.0f,0.0f,0.0f)" );
                    mNormal     .BindSlot( L"Normal",        this, MVT_Float3, "Parameters.VertexNormal" );
                    mSpecular   .BindSlot( L"Specular",        this, MVT_Float3, "float3(0.0f,0.0f,0.0f)");
                    mSpecularPow.BindSlot( L"SpecularPow",    this, MVT_Float,  "16.0f");
                    mOpacity    .BindSlot( L"Opacity",        this, MVT_Float,  "1.0f");
                }
             
             
                typedef std::vector<void*> FormatParameterArray;
             
                void MaterialNodePointLight::Compile(  )
                {
                    dword CodeGenLength = 0;
             
                    FormatParameterArray tFormatParameterArray;
             
                    // 編譯代碼,并構建格式化數組
                    for ( SlotList::iterator it = mSlotList.begin();
                        it != mSlotList.end();
                        ++it )
                    {
                        MaterialSlot* Slot = *it;
                        Slot->Compile();
             
                        CodeGenLength += StringHelperA::Length( Slot->GetResultCode() );
                        CodeGenLength += StringHelperA::Length( Slot->GetCaculateCode() );
             
                        tFormatParameterArray.push_back( (void*)Slot->GetCaculateCode() );
                        tFormatParameterArray.push_back( (void*)Slot->GetResultCode() );
                    }
             
                    // 讀取模板文件
                    FileStream ShaderFile;
                    if ( !ShaderFile.Open(L"shader/MaterialTemplatePixelShader.usf", FAM_Read ) )
                    {
                        Assert( false );
                    }
             
                    dword ShaderFileSize = ShaderFile.GetSize();
                    
                    AString ShaderTemplateCode;
                    ShaderTemplateCode.resize( ShaderFileSize + 1);
                    ShaderFile.ReadBuffer( (void*)ShaderTemplateCode.data(), ShaderFileSize * sizeof( char ) );
                    ShaderTemplateCode[ShaderFileSize] = 0;
             
                    mCompiler->WriteFinalCode( ShaderFileSize + CodeGenLength , ShaderTemplateCode.c_str(), &tFormatParameterArray[0] );
             
                }
            posted @ 2010-06-29 11:30 戰魂小筑 閱讀(1816) | 評論 (0)編輯 收藏

            最近使用材質節點生成HLSL代碼并開始編譯,也順手開始搭建一個正規的Shader包含及編譯流程,所以用到了D3DXCompileShader及ID3DXInclude

            ID3DXInclude的使用方法在OGRE 1.65(或者類似的版本)的OgreD3D9HLSLProgram.cpp中有源代碼可供參考

                    STDMETHOD(Open)(D3DXINCLUDE_TYPE IncludeType,
                        LPCSTR pFileName,
                        LPCVOID pParentData,
                        LPCVOID *ppData,
                        UINT *pByteLen
                        )

            此函數發生在代碼中有#include XXX時, FileName就是XXX

            ppData需要由用戶提供FileName對應的源碼內容,ANSI格式

            pByteLen是代碼長度

            STDMETHOD(Close)(LPCVOID pData)

            此函數的pData既是Open中提供的ppData, 用戶可以用于自行釋放內存等操作

             

            本來按照正常流程, HLSL代碼應該可以正常編譯,我的HLSL功能大概描述:

            Material.hlsl 提供基礎光照模型函數

            Material_Generated.hlsl 由材質節點生成的代碼,包含Main入口, #include "Material.hlsl"

            結果D3DXCompileShader報了一個莫名其妙的錯誤,找不到Main入口. 找了很久都沒發現代碼有什么問題. 于是開始回看OGRE代碼,發現了大俠們的一句救命留言:

            // copy into separate c-string
            // Note - must NOT copy the null terminator, otherwise this will terminate
            // the entire program string!
            馬上查閱我的代碼,為LoadFileToString函數添加一個參數,是否添加終結符0
                bool LoadFileToString( const char* FileName, AString& Content, bool TerminateString )
                {
                    wchar Buffer[MAX_PATH];
                    FileStream TFile;
                    if ( !TFile.Open(StringConverter::AnsiToUnicode( Buffer, MAX_PATH, FileName), FAM_Read ) )
                    {
                        return false;
                    }
             
                    dword FileSize = TFile.GetSize();
             
                    Content.resize( FileSize + (TerminateString ? 1: 0) );
                    TFile.ReadBuffer( (void*)Content.data(), FileSize * sizeof( char ) );
             
                    if ( TerminateString )
                        Content[FileSize] = 0;
             
                    return true;
                }

            D3DXCompileShader的Source 是需要終結的源碼, 但是在ID3DXInclude的實現類Open函數中,返回給ppData的,堅決不能有終止符0.

             

            總結:

               HLSL的代碼編譯過程是依賴#include將不同的文件碎片組合到一起后才開始解析,因此用戶提供的字符串尾部帶有終結符, 編譯器是沒有理由為你檢查數據的正確性的.去掉包含終結符才是正確的做法

            posted @ 2010-06-18 17:01 戰魂小筑 閱讀(1701) | 評論 (0)編輯 收藏

            僅列出標題
            共26頁: First 11 12 13 14 15 16 17 18 19 Last 
            色狠狠久久AV五月综合| 亚洲?V乱码久久精品蜜桃 | 久久免费国产精品一区二区| 最新久久免费视频| 精品国产热久久久福利| 久久这里只精品国产99热| 99精品久久精品| 99久久免费国产精精品| 久久精品国产半推半就| 日本福利片国产午夜久久| 久久九九青青国产精品| 久久天堂电影网| 久久久99精品一区二区| 99久久这里只精品国产免费| 日本WV一本一道久久香蕉| 日韩人妻无码精品久久免费一| 久久精品国产亚洲AV香蕉| 亚洲国产精品一区二区久久hs| 欧美亚洲色综久久精品国产| 精品国产乱码久久久久久郑州公司 | 久久国产三级无码一区二区| 久久久久亚洲精品无码网址 | 亚洲精品国精品久久99热一| 久久丫精品国产亚洲av不卡| 久久精品国产精品青草| 开心久久婷婷综合中文字幕| 一本色道久久88综合日韩精品| 少妇精品久久久一区二区三区| 91精品国产91久久久久久| 亚洲一区精品伊人久久伊人| 久久精品无码专区免费青青| 国产成人无码精品久久久免费| 亚洲国产成人精品女人久久久| 天天躁日日躁狠狠久久| 久久精品国产黑森林| 婷婷久久久亚洲欧洲日产国码AV| 66精品综合久久久久久久| 久久精品中文字幕一区| 欧美一区二区精品久久| 久久亚洲精品国产精品| 一级女性全黄久久生活片免费 |