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

Google
3D遊戲程式設計入門第14章心得[未解之疑問篇]

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


註冊時間: 2007-05-02
文章: 684

2639.56 果凍幣

發表發表於: 2010-2-24, PM 10:08 星期三    文章主題: 3D遊戲程式設計入門第14章心得[未解之疑問篇] 引言回覆

前言:此乃補丁文。只講解心得,不提供完整教學,有興趣的人請自行購買此書。
代碼:
書名:3D遊戲程式設計入門-使用DirectX 9.0實作
作者:Frank D. Luna
譯者:黃聖峰
出版社:博碩文化


此章節三個範例的Camera::walk、Camera::strafe及W、S鍵的pitch行為
都請依照第12章及第13章所述的修改方式修正
另GetRandomFloat的註解所述取值範圍有誤,請參考第13章的說明

除了以上的修改之外,此章沒有什麼其他需要修改的地方,但是疑問卻是一大堆
疑問一:
D3DLOCK_DISCARD在書上的說明是「它指示硬體拋棄緩衝器,並傳回指向新設緩衝器的指標」
就我的猜測,我覺得這是指
「它會取得一塊新的記憶體區塊,而舊的那塊有鎖定保護,使其不會在繪製完成前被修改資料,並且在繪製完成後它有機制會自動使其釋放」
不知道我的這個假設是否是正確的?

疑問二:
請看一下Firework System那個範例,在Firework::preRender()中
代碼:
_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

這兩行的功能是把 目標色 與 來源色 相加
因為這個範例使用的tex是flare.bmp,沒有alpha channel(其餘兩個範例都使用有alpha的dds檔)
所以只要把其欲透明的背景設成純黑色(R0 G0 B0)
那麼目標色與來源色相加之後,背景部份就會只剩下原本的目標色,也就如同透明了
當然,如果目標色與來源色相加後單分色大於255,它也只會停在255
以上所說,還必須建立在一個基礎之上,就是必須把深度測試給關掉:
代碼:
_device->SetRenderState(D3DRS_ZWRITEENABLE, false);

否則前面的會蓋住後面的,因為沒有alpha又不在同一深度的話,就談不上混色了

現在問題來了,上面所述理論上看起來對
但我實際寫了個小程式,把單一個粒子放大來看後
發現邊邊的黑色背景居然透得不完全
仔細看還可以看到粒子color的顏色
為什麼會這樣呢?

而且老實說,我本來以為有tex就不能夠有color的…
所以才會寫個小程式測測,沒想到tex跟color真的可以同時現色
那麼它們之間混合的比例跟方程式是什麼呢?
有地方可以設定嗎?
上面所說黑色背景透得不完全會是因為tex的黑色混到color顏色的關係嗎?

我有想過可能是我寫的小程式有問題才會這樣
但我試著修改了一下本範例
將Firework::resetParticle中的
代碼:
attribute->_velocity *= 100.0f;

給註解掉,使其爆開速度變慢
再把
代碼:
attribute->_lifeTime = 2.0f;

改成
代碼:
attribute->_lifeTime = 200.0f;

使其存活時間延長
然後仔細觀察
發現粒子真的有黑背景透色不完全的狀況
還請了解的大大能夠解說一下,謝謝

另外附上一些我測試時的小心得
1.把tex拿掉的話,畫出來的點是正方形的(廢話,所以才需要tex來"塑形")

2.把
代碼:
_device->SetRenderState(D3DRS_ZWRITEENABLE, false);

註解掉的話,黑背景就沒辦法混色,會很明顯顯示出來了
另外如果讓爆開速度變慢,可以發現一開始的全白光團會變成彩色光團(也是廢話,因為沒混色了)

3.雖然跟這個範例無關,但這是我寫小程式時想起來的,之前的章節中忘了解說
要在頂點上加上uv座標,必須在FVF中多"|"一個D3DFVF_TEX1,其位置要在D3DFVF_DIFFUSE之後
要注意的是,"|"的是D3DFVF_TEX1而不是D3DFVF_TEX0
D3DFVF_TEX0代表的意義是不使用uv貼圖
我不知道它應該用在哪,我猜或許是開發時方便測試用的
但我有試了一下,在一切設定ok的狀況下把D3DFVF_TEX1改成D3DFVF_TEX0會使得應該有貼圖的位置變成全黑

疑問三:
接疑問二,我們有說必須把深度測試給關掉,才能混色:
代碼:
_device->SetRenderState(D3DRS_ZWRITEENABLE, false);

但是我卻發現了一個矛盾的現象
把爆發速度變慢後可以觀察出來
遠處煙火的粒子會被場景給蓋住,而近處煙火的粒子卻可以蓋住場景,或說,會跟場景混色
明明深度測試就關閉了,為什麼粒子還會被場景蓋住呢?
如果說是因為沒有清掉Z-Buffer的原因
那為什麼飛到近處的粒子卻又可以跟場景混色呢?
在沒有更動Z-Buffer的情況下,所有的粒子不論位置應該具有一樣的景深才對啊
怎麼會有兩種不同的現象出現呢?

共三大疑問,謝謝。
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
EzGamer
偶而上來逛逛的過客


註冊時間: 2009-11-14
文章: 5

66.27 果凍幣

發表發表於: 2010-3-26, AM 9:42 星期五    文章主題: 引言回覆

先說一聲抱歉,我沒看過那本書,也沒有太多時間仔細回複細節

首先在假設之前可以先去看看DirextX SDK的文件,大多數的疑問,裡面應該都能找到答案,比方
D3DLOCK_DISCARD

The application overwrites (with a write-only operation) every location within the region being locked. This is a valid option when using dynamic textures, dynamic vertex buffers, and dynamic index buffers.
For vertex and index buffers, the application discards the entire buffer. A pointer to a new memory area is returned so that the dynamic memory access (DMA) and rendering from the previous area do not stall.

For textures, the application overwrites (with a write-only operation) every location within the region being locked.

DISCARD的意義只是在你可以完全複寫而已,是不是原來的記憶體,根本不用care,不過你所說的書上說明看來上文是指vertex and index buffers,也就是多邊形資料的buffer才會有new memory,不包括texture。

第二點:
關於Alpha混色的部分,去看看「D3DBLEND Enumerated Type」的說明,兩個都為ONE簡單說就是兩者R+R B+B G+G,無視Alpha而已,所以當然會吃到顏色,因為當你把圖變大時,DX預設會柔邊,簡單說就是在0和255間多出來的pixel就是128…

第三點
至於Z buffer的問題…D3DRS_ZWRITEENABLE 只是開關寫入,所以貼的Blend蓋不掉前景。除非關Z的「偵測 」D3DRS_ZENABLE。
(編輯過,原來的回文誤解版主的問題了)

_________________
http://EzEngine.blogspot.com
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

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


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