維尼的蜂巢

Archive for the ‘DirectX’ Category

_IID_IDirect3DTexture9的error link

Posted by: kevinlin on: 二月 15, 2006

以前每次用別人函式庫常常都ErrorLink 還好現在都能順利的解決
來紀錄一下這個最近找了還蠻久的錯誤 _IID_IDirect3DTexture9 解決方法 
error LNK2001: unresolved external symbol _IID_IDirect3DTexture9
 加上dxguid.lib到Linker的input

ButterFly演化過程

Posted by: kevinlin on: 二月 15, 2006

ButterFly_v1
是基於directx9.0c的DXUT來作的,內容有許多2d該有的都有而3d是讓DXUT來做,缺點是只能在WinNT系列下跑,且太老舊電腦不能跑,且DXUT太龐大實在懶的修改
ButterFly_v2
實作跨平台(有opengl[簡單版]、directX、software),software模式可讓遊戲在三種平台上跑[MacOS、Windows、Linux],只是還沒有sound系統單純的繪圖引擎(因為openal太麻煩了),還有中文的支援問題,雖然可以顯示及輸入中文,但字很醜,還有因為為了想跨平台失去了一些效能,所以暫且放下不用
目前開發ButterFly_v3中
基於Windows平台,針對Windows平台對引擎最佳化,全部是基於directx9.0c用Directsound、Directinput、DirectShow來實做一些功能,既快速文件又豐富,跟ButterFly_v1不同的是不用DXUT而自己實作較底層的東西,對於2d能更快速的展示及自訂的檔案格式來取代zip加速打包檔案搜尋速度,及自訂的3d格式
暫訂使用這版本來對windows作開發(漂亮的蝴蝶總是從醜陋的毛毛蟲變來的)

SetTextureStageState

Posted by: kevinlin on: 十月 26, 2005

前面有寫了一個setsamplerstate 那是對單一張貼圖的處理
現在來講 多張貼圖 要怎樣做呢
 
就是用
HRESULT SetTextureStageState(
   DWORD Stage,   //stage的值(從0到7 表示可貼8張)
   D3DTEXTURESTAGESTATETYPE Type,  //你想要改變貼圖狀態的旗標
   DWORD Value //貼圖狀態對應的值
);
Stage – the stage value, ranges from 0 to 7 (a count of State – this is a flag representing one of the texture states that you want to change.Value – each state can have a value, what goes here [...]

Transparent Textures

Posted by: kevinlin on: 十月 26, 2005

要用透明貼圖在D3D裡面 非常簡單
先建立一個有alpha層的貼圖
 
然後在rendering前 enable alpha blending
 
SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
 
Note:如果準備rendering很多張半透明的貼圖 而且會互相蓋到 那就要在rendering前 先對他們做排序 從後面到前面排序 這樣才能正確的畫出
 
ps: 對renderState的設定 過幾天再來寫

SetSamplerState

Posted by: kevinlin on: 十月 24, 2005

http://www.toymaker.info/Games/html/sampler_states.html
 
 
IDirect3DDevice9::SetSamplerState Method——————————————————————————–設置紋理取樣器的狀態值。
語法:HRESULT SetSamplerState( DWORD Sampler, // 取樣器編號,如果只有一張這邊設0D3DSAMPLERSTATETYPE Type, // 取樣器狀態類型DWORD Value // 取樣器狀態所對應的值);——————————————————————————–
其中的 Type 在 D3DSAMPLERSTATETYPE 中列舉:
D3DSAMPLERSTATETYPE Enumerated Type——————————————————————————–sampler的狀態定義紋理的sample(取樣)操作,例如紋理定位和紋理過濾。一部分取樣器狀態配置頂點處理,一部分配置像素處理。取樣器狀態可以通過狀態塊保存和恢復。
語法:typedef enum _D3DSAMPLERSTATETYPE {D3DSAMP_ADDRESSU = 1, // 紋理坐標定位 UD3DSAMP_ADDRESSV = 2, // 紋理坐標定位 VD3DSAMP_ADDRESSW = 3, // 紋理坐標定位 W D3DSAMP_BORDERCOLOR = 4, // 邊框顏色D3DSAMP_MAGFILTER = 5, // 放大過濾類型D3DSAMP_MINFILTER = 6, // 縮小過濾類型D3DSAMP_MIPFILTER = 7, // 多紋理過濾類型D3DSAMP_MIPMAPLODBIAS = [...]

D3D Create小小紀錄

Posted by: kevinlin on: 九月 22, 2005

之前都在寫core engine 對UI超級不熟 現在要來多練練

 
詢問顯示卡是否能符合我們給的一些東西
HRESULT CheckDeviceType(   UINT Adapter,   D3DFORMAT DisplayFormat,   D3DFORMAT BackBufferFormat,   BOOL Windowed);
 
建構D3D裝置需要的參數
typedef struct _D3DPRESENT_PARAMETERS_ {    UINT BackBufferWidth, BackBufferHeight;    D3DFORMAT BackBufferFormat;    UINT BackBufferCount;    D3DMULTISAMPLE_TYPE MultiSampleType;    DWORD MultiSampleQuality;    D3DSWAPEFFECT SwapEffect;    HWND hDeviceWindow;    BOOL Windowed;    BOOL EnableAutoDepthStencil;    D3DFORMAT AutoDepthStencilFormat;    DWORD Flags;    UINT FullScreen_RefreshRateInHz;    UINT PresentationInterval;} D3DPRESENT_PARAMETERS;
 
  BackBufferWidth和BackBufferHeight:後備緩衝的寬度和高度。在全屏模式下,這兩者的值必需符合顯卡所支持的分辨率。例如(800,600),(640,480)。

       BackBufferFormat:後備緩衝的格式。這個參數是一個D3DFORMAT枚舉類型,它的值有很多種,例如D3DFMT_R5G6B5,這說明後備緩衝的格式是每個像素16位,其實紅色(R)占5位,綠色(G)占6位,藍色(B)占5位,為什麼綠色會多一位呢?據說是因為人的眼睛對綠色比較敏感。DX9只支持16位和32位的後備緩衝格式,24位並不支持。如果對這D3DFORMAT不熟悉的話,可以把它設為D3DFMT_UNKNOWN,這時候它將使用桌面的格式。

       BackBufferCount:後備緩衝的數目,範圍是從0到3,如果為0,那就當成1來處理。大多數情況我們只使用一個後備緩衝。使用多個後備緩衝可以使畫面很流暢,但是卻會造成輸入設備響應過慢,還會消耗很多內存。

       MultiSampleType和MultiSampleQuality:這兩個參數可以使你的渲染場景變得更好看,但是卻消耗你很多內存資源,而且,並不是所有的顯卡都支持這兩者的所設定的功能的。在這裡我們分別把它們設為D3DMULTISAMPLE_NONE和0。

       SwapEffect:交換緩衝支持的效果類型。它是D3DSWAPEFFECT列舉類型,可以設定為以下三者之一:D3DSWAPEFFECT_DISCARD,D3DSWAPEFFECT_FLIP,D3DSWAPEFFECT_COPY。如果設定為D3DSWAPEFFECT_DISCARD,則後備緩衝區的東西被複製到螢幕上後,後備緩衝區的東西就沒有什麼用了,可以丟棄(discard)了。如果設定為D3DSWAPEFFECT_FLIP,則表示在顯示和後備緩衝之間進行週期循環。設定D3DSWAPEFFECT_COPY的話,我也不太清楚有什麼作用*^_^*。一般我們是把這個參數設為D3DSWAPEFFECT_DISCARD。

       hDeviceWindow:顯示設備輸出窗口的handle

       Windowed:如果為FALSE,表示要渲染全螢幕。如果為TRUE,表示要渲染視窗。渲染全螢幕的時候,BackBufferWidth和BackBufferHeight的值就得符合顯示模式中所設定的值。

       EnableAutoDepthStencil:如果要使用Z緩衝,則把它設為TRUE。

       AutoDepthStencilFormat:如果不使用深度緩衝,那麼這個參數將沒有用。如果啟動了深度緩衝,那麼這個參數將為深度緩衝設定緩衝格式(和設定後備緩衝的格式差不多)

       Flags:可以設置為0或D3DPRESENTFLAG_LOCKABLE_BACKBUFFER。不太清楚是用來做什麼的,看字面好像是一個能否鎖定後備緩衝區的標記。

       FullScreen_RefreshRateInHz:顯示器的更新頻率,單位是HZ,如果設定了一個顯示器不支持的更新頻率,將會不能創建設備或發出警告信息。為了方便,一般設為D3DPRESENT_RATE_DEFAULT就行了。

       PresentationInterval:如果設置為D3DPRENSENT_INTERVAL_DEFAULT,則說明在顯示一個渲染畫面的時候必要等候顯示器刷新完一次螢幕。例如你的顯示器刷新率設為80HZ的話,則一秒內你最多可以顯示80個渲染畫面。另外你也可以設置在顯示器刷新一次螢幕的時間內顯示1到4個畫面。如果設置為D3DPRENSENT_INTERVAL_IMMEDIATE,則表示可以以即時的方式來顯示渲染畫面,雖然這樣可以提高frame(FPS),但是卻會產生圖像撕裂的情況。

 
 
D3D會發生的錯誤列舉 不知道有沒有寫好處理錯誤訊息的東西 就不用自己寫了
typedef enum {    D3D_OK,    D3DOK_NOAUTOGEN,    D3DERR_CONFLICTINGRENDERSTATE,    D3DERR_CONFLICTINGTEXTUREFILTER,    D3DERR_CONFLICTINGTEXTUREPALETTE,    D3DERR_DEVICELOST,    D3DERR_DEVICENOTRESET,    D3DERR_DRIVERINTERNALERROR,    D3DERR_DRIVERINVALIDCALL,    D3DERR_INVALIDCALL,    D3DERR_INVALIDDEVICE,    D3DERR_MOREDATA,    D3DERR_NOTAVAILABLE,    D3DERR_NOTFOUND,    D3DERR_OUTOFVIDEOMEMORY,    D3DERR_TOOMANYOPERATIONS,    D3DERR_UNSUPPORTEDALPHAARG,    D3DERR_UNSUPPORTEDALPHAOPERATION,    D3DERR_UNSUPPORTEDCOLORARG,    D3DERR_UNSUPPORTEDCOLOROPERATION,    D3DERR_UNSUPPORTEDFACTORVALUE,    D3DERR_UNSUPPORTEDTEXTUREFILTER,    D3DERR_WASSTILLDRAWING,    D3DERR_WRONGTEXTUREFORMAT,    E_FAIL,    E_INVALIDARG,    E_INVALIDCALL,    E_NOINTERFACE,    E_NOTIMPL,    E_OUTOFMEMORY,    S_OK} D3DERR;
 

       HRESULT CreatDevice(

              UINT Adapter,

              [...]

遇到奇怪的error不過解決了

Posted by: kevinlin on: 八月 25, 2005

 error C2061: 語法錯誤 : 識別項 ‘LPDIRECTXFILEDATA’
加上#include <dxfile.h>就好了

error C2664: ‘D3DXLoadMeshFromXof’ : 無法將參數 1 從 ‘LPDIRECTXFILEDATA’ 轉換成 ‘LPD3DXFILEDATA’

原來d3d9開始建議不要用 ‘LPDIRECTXFILEDATA’ 真是難搞
但只要強制轉型就好了 (LPD3DXFILEDATA)xxx