上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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 果凍幣
|
|
回頂端 |
|
|
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 |
|
回頂端 |
|
|
|