在Windows XP下, 在任何磁盤里,創建一個文件,再復制粘貼,就會生成一個新的拷貝.文件名中有個詞叫:"復件"
但是感覺這個詞貌似是學多了英語后的人硬拼出來的,時間長了,大家習慣了這個叫法,這個詞也就出來了.
在Windows Vista或者Windows 7里,這個詞變成了 "副本", 估計是微軟也發現"復件"這個詞不是很正規或者讓人接受而換的
:)
戰魂小筑討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu |
在Windows XP下, 在任何磁盤里,創建一個文件,再復制粘貼,就會生成一個新的拷貝.文件名中有個詞叫:"復件"
但是感覺這個詞貌似是學多了英語后的人硬拼出來的,時間長了,大家習慣了這個叫法,這個詞也就出來了.
在Windows Vista或者Windows 7里,這個詞變成了 "副本", 估計是微軟也發現"復件"這個詞不是很正規或者讓人接受而換的
:)
OGRE 中的3種層次實現多線程渲染的文檔:
http://isdlibrary.intel-dispatch.com/vc/1632/Threading_OGRE3D.pdf
ATI有關多線程效率提升的游戲比較及一些tips
從Windows XP SP2通過Windows Updates 的SP3推送更新到SP3并不是真正意義上的SP3. 至少發現有以下兼容問題:
1. RenderMonkey 1.82 在這種升級版本下會啟動會報MSXML錯誤
2. VS2010 安裝完成后, C#和WPF工程都無法正常創建,打開vs2008及老的sln,project都會出現卡死,甚至崩潰的錯誤. 估計也是MSXML的問題
解決方法:安裝Windows 更高版本或者直接使用原生Windows SP3
名稱:Chrome Stylist
地址:https://chrome.google.com/extensions/detail/pabfempgigicdjjlccdgnbmeggkbjdhd?hl=zh-cn
安裝好后,在StyleList的選項里找到Styles選項卡,將里面其他的刪除,新建一個Style,點上All Site,在黑色欄里填入一個你喜歡的名字,在css內容里填入
html, body, * {
font-family: "微軟雅黑" ! important;
}
點擊下面的save存盤,刷新其他網站,地址欄最右邊出現彩虹的圖標就表示工作正常了
have fun, :)
假設我們有3個工程及其工程類型:
CORE DLL
ENGINE DLL
GAME EXE
D3DRENDER DLL
其中D3DRENDER是GAME動態載入的,其需要鏈接CORE,ENGINE
這是一個很常見的模式,但是不好的是,因為CORE和ENGINE均是DLL,代碼中的Symbol都被導出才可使用。任何人使用DEPENDENCE工具就可以將DLL中引用的東西查看的清楚,雖然這不至于造成技術泄漏,但從速度和DLL大小來說都是不劃算的。
現在很多游戲主exe一般都是10M+甚至20M+的大exe,這都是使用靜態鏈接而成。但是對代碼結構也必須做出一定的調整。所有工程必須都是靜態庫,這樣才能保證像CORE這樣的靜態庫中的全局/靜態變量不至于被鏈接2份而造成內存段邏輯錯誤。
當然,使用全靜態庫還需要注意一點:所有的lib都是在最后的game工程里來做鏈接。
轉載自 獨立游戲中文論壇
UDK是unrealengine develpoment kit 的縮寫,簡單來說就是大名鼎鼎的虛幻3引擎的免費商業版本.不過虛幻3畢竟還是4年前的dx9的入門級引擎,在商業上取得
巨大成功,技術上也顯得落后.目前Epic想榨干虛幻3的最后一點潛力,于是干脆發布了這個免費版本.任何人都可以用UDK開發游戲,但是如果游戲牟利的話每年還是要向
Epic交納一定數量的技術授權費用的.先不管這個,還是來看看它的官方視頻教程吧.
[attach]44[/attach]
鏈接如下:
http://udn.epicgames.com/Three/VideoTutorials.html
一共5個教程 從引擎配置介紹開始,到關卡和人物編輯器,以及最后一個完整的小游戲的制作,對于入門來說完全足夠了.
視頻說的還比較詳細,聽力不好的同學可以對照下開發文檔 http://www.udk.com/documentation 里面基本說的很詳細.
最后附上UDK的下載地址: March 2010 UDK Beta (548 MB .exe)
好了,UDK對于初學者來說還是比較適合的.對于游戲的開發人員來說引擎的整體架構還是很值得學習的.希望你學的愉快.
RenderTarget完成后,開始模擬OGRE的Compositor。
OGRE的Compositor其實就是用于解決繪制PostEffect的,簡單的說,就是一種RenderTarget的流程控制腳本
這是OGRE compositor文件的片段
compositor Bloom
{
technique
{
// Temporary textures
texture rt_output target_width target_height PF_R8G8B8
texture rt0 target_width_scaled 0.25 target_height_scaled 0.25 PF_R8G8B8
texture rt1 target_width_scaled 0.25 target_height_scaled 0.25 PF_R8G8B8
target rt_output
{
// Render output from previous compositor (or original scene)
input previous
}
target rt0
{
// Start with clear texture
input none
// Horizontal blur pass
pass render_quad
{
// Renders a fullscreen quad with a material
material Ogre/Compositor/BrightPass2
input 0 rt_output
}
}
target rt1
{
// Start with clear texture
input none
// Horizontal blur pass
pass render_quad
{
// Renders a fullscreen quad with a material
material Ogre/Compositor/BlurV
input 0 rt0
}
}
target rt0
{
// Start with clear texture
input none
// Horizontal blur pass
pass render_quad
{
// Renders a fullscreen quad with a material
material Ogre/Compositor/BlurH
input 0 rt1
}
}
target_output
{
// Start with clear output
input none
// Draw a fullscreen quad
pass render_quad
{
// Renders a fullscreen quad with a material
material Ogre/Compositor/BloomBlend2
input 0 rt_output
input 1 rt0
}
}
}
}
大概我們知道,一個Compositor分為資源定義與繪制步驟(target xxx)
而一個繪制步驟又分別定義:
1. (輸入)繪制的是什么東西?
2. (效果)繪制成什么樣子?
3. (輸出)往哪里繪制?
輸出方式在這個例子有2種:紋理(RT)和屏幕
輸入方式有2中:紋理及場景
我們可以使用一個回調來對一個繪制步驟提供繪制輸入
繪制效果就是一大堆的Shader,這些shader都是基于一個quad來做的,也就是一個矩形,使用變換后的頂點和一個紋理坐標作為頂點定義
不過這里是不需要做vertexshader的,僅僅ps足矣。
繪制的最后,是將前面繪制的RT(紋理)混合起來
當然,如果步驟比較多和復雜時,RT之間跟寄存器一樣,可以反復使用
顯示茶壺法線的場景加上 Blur 的PostEffect
<?xml version="1.0" encoding="gb2312" ?>
<Compositor name = "bloom" >
<Resource>
<RenderTarget name ="rt_source" size="screenquad" />
<RenderTarget name ="rt0" size="screenquad" />
<RenderTarget name ="rt1" size="screenquad" />
</Resource>
<Step target="rt_source">
<Geometry type ="callback" callback = "rt_input"/>
</Step>
<Step target="rt0">
<Geometry type = "screenquad"/>
<Effect name ="material\blurH.xml">
<Texture name ="mTexture" value ="rt_source" />
</Effect>
</Step>
<Step target="rt1">
<Geometry type = "screenquad"/>
<Effect name ="material\blurV.xml">
<Texture name ="mTexture" value ="rt_source" />
</Effect>
</Step>
<Step>
<Geometry type = "screenquad"/>
<Effect name ="material\combine.xml">
<Texture name ="mTexture1" value ="rt0" />
<Texture name ="mTexture2" value ="rt1" />
</Effect>
</Step>
</Compositor>
如果讓你的引擎結構支持多個RenderTarget繪制及多個Viewport?這里是我的簡單設計:
同樣適用我的文本設計圖標準(+為包含, <為派生)
RenderTexture
RenderTarget
<ScreenTarget(引擎啟動時,初始化屏幕大小的Viewport)
+RenderView (對于一個RT,可以是屏幕,可以是紋理RT,所以可以擁有 1~n個切分視圖 )
+Camera
+Viewport
以下是多View繪制的類XNA偽代碼
Engine.Run()
{
Device.Clear()
// 保存當前全屏Viewport
ScreenViewport = Device.CurrentViewport
Device.BeginScene()
// 遍歷當前屏幕RT下的所有View
foreach RenderView in ScreenRT
{
// 未激活的View不用繪制
if RenderView not active then continue
// 將View對應的Viewport提交到設備
RenderView.CommitViewport()
// 渲染回調
foreach RenderEventListener in RenderEventListenerList
{
RenderEventListener.OnRenderFrame()
}
}
Device.EndScene()
Device.Present()
Device.CurrentViewport = ScreenViewport // 恢復全屏viewport
}
以下是RT間嵌套繪制的偽代碼:
RenderView.SwitchRenderTarget(stage, RenderTarget)
{
// 保存繪制前的RT
PreTarget = Device.GetRenderTarget()
// 設置為當前的RT
Device.SetRenderTarget( RenderTarget )
// 更新RT攝像機
RenderTarget.UpdateCamera()
// 清空RT
Device.Clear()
// 繪制回調
RenderTarget.OnRender( )
// 恢復之前的RT
Device.SetRenderTarget( PreTarget );
}
完成自己的shader系統后,翻出之前寫過的代碼中發現有一個地方很奇怪
我的矩陣定義跟OGRE的沒什么區別
union
{
struct
{
float m11, m12, m13, m14;
float m21, m22, m23, m24;
float m31, m32, m33, m34;
float m41, m42, m43, m44;
};
float m[4][4];
};
乘法也跟OGRE的一模一樣,但在將view及project乘好的矩陣送給HLSL時,卻必須轉置下,才能得到正確的結果
mSkinnedEffect.mMatrix.mValue = (camera.mViewMatrix * camera.mProjectMatrix).Transpose();
shader:
float4 localpos = mul(In.Position, skinTransform);
OGRE中有這么一段代碼及注釋:
const Matrix4& AutoParamDataSource::getProjectionMatrix(void) const
{
if (mProjMatrixDirty)
{
// NB use API-independent projection matrix since GPU programs
// bypass the API-specific handedness and use right-handed coords
if (mCurrentRenderable && mCurrentRenderable->getUseIdentityProjection())
{
// Use identity projection matrix, still need to take RS depth into account.
RenderSystem* rs = Root::getSingleton().getRenderSystem();
rs->_convertProjectionMatrix(Matrix4::IDENTITY, mProjectionMatrix, true);
}
else
{
mProjectionMatrix = mCurrentCamera->getProjectionMatrixWithRSDepth();
}
if (mCurrentRenderTarget && mCurrentRenderTarget->requiresTextureFlipping())
{
// Because we're not using setProjectionMatrix, this needs to be done here
// Invert transformed y
mProjectionMatrix[1][0] = -mProjectionMatrix[1][0];
mProjectionMatrix[1][1] = -mProjectionMatrix[1][1];
mProjectionMatrix[1][2] = -mProjectionMatrix[1][2];
mProjectionMatrix[1][3] = -mProjectionMatrix[1][3];
}
mProjMatrixDirty = false;
}
return mProjectionMatrix;
}
貌似是跟左右手這個惡心的東西有關系
回看DirectXSDK中提供的BasicHLSL例子
mWorld = g_mCenterWorld * *g_Camera.GetWorldMatrix();
mProj = *g_Camera.GetProjMatrix();
mView = *g_Camera.GetViewMatrix();
mWorldViewProjection = mWorld * mView * mProj;
V( g_pEffect->SetMatrix( "g_mWorldViewProjection", &mWorldViewProjection ) );
shader:
Output.Position = mul(vAnimatedPos, g_mWorldViewProjection);
絲毫無需轉置矩陣,Effect接口中也提供有SetMatrixTranspose這類方法。所以排除內部有自動轉置的嫌疑。
詢問過野豬這個問題,野豬答曰:"轉置后傳輸至需要傳3個vector, 最后一個是[0 0 0 1]”
有達人知道的,可以指點下迷津 :)