電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
[請益] 請問關於 D3DPOOL_SYSTEMMEM 的相關設定

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

505.97 果凍幣

發表發表於: 2008-11-24, PM 8:25 星期一    文章主題: [請益] 請問關於 D3DPOOL_SYSTEMMEM 的相關設定 引言回覆

各位前輩好 小弟目前要把遊戲系統的RENDER方式 由D3DPOOL_MANAGED

改為使用 D3DPOOL_SYSTEMMEM 但是有一小部分的程式碼只要設為D3DPOOL_SYSTEMMEM

則其Texture顯示就會異常 即畫面會幾乎呈現為全白 這兩天努力的閱讀文件以及網頁資訊

只有發現 D3DPOOL_SYSTEMMEM 似乎是要使用 UpdateTexture 做Update

但是我使用其Update之後 結果依然一樣 而且有另外一個顯示正常的Function

其內部程式碼除了檔案讀取不一樣外 其他設定一模一樣 而且也並未使用 UpdateTexture

把Texture 做處理 因此小弟我傷透腦筋 完全沒有頭緒 因此想請問各位前輩 關於在使用

D3DPOOL_SYSTEMMEM 上 是否有什麼特別比較需要注意的地方 麻煩給小弟一些線索去研究

謝謝
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

505.97 果凍幣

發表發表於: 2008-11-25, PM 4:46 星期二    文章主題: 引言回覆

目前我已找到錯誤的原因 就是在設定為 D3DPOOL_SYSTEMMEM 的情況下使用 SetTexture

根據MSDN DevCaps 必須設為 D3DDEVCAPS_TEXTURESYSTEMMEMORY (http://0rz.tw/2e57I)

因此目前我的想法為 在錯誤的地方 抓取他的 IDirect3DDevice9 藉此更改 DevCaps

改法如下:

//IDirect3DDevice9* pd3dDevice;
.
.
.
//IDirect3DDevice9* pd3dDevice;
.
.
.
D3DCAPS9* pd3dCaps = GetDXUTState().GetCaps();

pDevice->GetDeviceCaps( pd3dCaps );

pd3dCaps->DevCaps = D3DDEVCAPS_TEXTURESYSTEMMEMORY;


但是這樣修改 還是一樣會出現 螢幕幾乎全白的BUG

請問各位前輩 我這樣是否有哪邊還未考慮詳盡之處 煩請指導 謝謝
回頂端
檢視會員個人資料 發送私人訊息
vamper
對這略感興趣的新人


註冊時間: 2007-06-23
文章: 29
來自: 台灣
18.82 果凍幣

發表發表於: 2008-11-26, AM 12:29 星期三    文章主題: 引言回覆

看這文章吧~此人跟你一樣的問題。

在gamedev的搜尋打上「D3DPOOL_SYSTEMMEM」,會有你要的資訊。

http://www.gamedev.net/community/forums/topic.asp?topic_id=436009
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

505.97 果凍幣

發表發表於: 2008-11-26, PM 3:47 星期三    文章主題: 引言回覆

今天有試過以 UpdateTexture 來作測試
不過我想我在基礎的部分還不是很了解 所以再來這邊請教大家

1.請問UpdateTexture是直接取代LockRect與UnlockRect之間所做的動作嗎??
還是兩者皆要存在??

2.我的系統在Texture的宣告是使用 LPDIRECT3DTEXTURE9
而UpdateTexture的Texture參數是以 IDirect3DBaseTexture9 做宣告
就算我使用強制轉型 Complier也一樣不過 DirectX有其他可取代的Function嗎?

3.我有在MSDN上看到 若POOL設定為 D3DPOOL_SYSTEMMEM
則DevCaps要設定為 D3DDEVCAPS_TEXTURESYSTEMMEMORY
但網路上有提 並非所有顯卡都支援 D3DDEVCAPS_TEXTURESYSTEMMEMORY
而且我之前的文章有提到 我沒有發現可以設定 DevCaps 的方式
請問真的沒有設定DevCaps的方式嗎??

4.我研究到現在 我想問題關鍵點應該是在 在設定為D3DPOOL_SYSTEMMEM 時
想要載入的圖片並沒有貼上去 所以才以系統預設的白色填滿
因此問題的成因 是因為POOL設定為D3DPOOL_SYSTEMMEM
所以LockRect與UnlockRect之間的動作 才無法發揮功用
這是因為圖片目前Loading在 主記憶體上 而非顯示卡記憶體上
只要我能夠把主記憶體上的資料 搬移到顯示記憶體上 就能夠正常運作??
請問我以上的推論是正確的嗎??


麻煩大家非常不好意思 但是還是拜託大家給予我指導 謝謝大家
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

505.97 果凍幣

發表發表於: 2008-11-26, PM 6:08 星期三    文章主題: 引言回覆

我剛剛終於實驗出來了 看起來我的基礎還真是不行 要多多加強 (汗顏)

1.
兩者皆要存在 因為 UpdateTexture 的第一個參數為 Resource 第二個為 Destination

所以做為Resource的第一個參數 便要使用LockRect與UnlockRect之間做的動作載入圖片

再利用 UpdateTexture 把圖片載入至 Destination


2.
這邊真的是很汗顏了 代表我連C都有問題了 囧rz

MSDN對於 UpdateTexture 的記載如下:

HRESULT UpdateTexture(
IDirect3DBaseTexture9 * pSourceTexture,
IDirect3DBaseTexture9 * pDestinationTexture
);

而我兩個準備要載入的變數宣告如下:

LPDIRECT3DTEXTURE9* pOutTexture;
LPDIRECT3DTEXTURE9 pTexture;

所以我當時是以如下方式使用:

UpdateTexture( &pTexture , pOutTexture );

發現不行 就改以強制轉型宣告:

UpdateTexture( &(IDirect3DBaseTexture9 )pTexture
, (IDirect3DBaseTexture9 )pOutTexture );

結果當然還是不行...然後改為:

pDevice->UpdateTexture( pTexture , *pOutTexture );

就可以了...看起來我真的還未夠班啊...不過我還是有點不太懂 可以說是硬測試出來的

可否有前輩 針對這一點解釋一下 拜託 謝謝


3.
因為問題解決了 所以我就沒繼續探討了 <囧


4.
感謝PTT的moremusic 的指導 以下為他的推文解答:
推 moremusic:推論不對 你試著讀取貼圖的pixel值來看看 11/26 16:53
→ moremusic:應該是載入貼圖失敗 跟顯示卡記憶體無關 11/26 16:53
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作