star bloom

另一種形態 bloom: star bloom

我現在已經不知道要寫甚麼特效了,(僅限 dx9),
看有沒有甚麼好建議(僅限 dx9)?




現在我的困惱dx9? dx10?

大部分簡單的3D特效都寫得差不多了, 接下來的就是比較困難(非常困難)

再來 dx9的功能對我也不夠使用了.

dx9說穿了  只要把render target 弄熟, 就差不多了.

目前的3D卡有個很大的致命傷.

在 shader code 可以輸入很多資料, 材質 頂點 外部的變數,

但是:輸出 一律只能輸出到 render taget. 理論上 是夠了, 但是十分缺少彈性.

dx10提供的功能:

1.Geometry Shader: 最常用來做particle, 但應該不只這些應用.

dx9就是 vertex shader-->然後pixel  shader, 但是 你輸入的有三角形資訊,
就是你是劃三角形, 那怎麼  shader code 裡面都沒有三角形的資訊?

所以: Geometry Shader 就是被公開了.

2.Stream Output: 可以不需要經過 pixel shader, 就可直接把頂點運算過的資料輸出.
這是之前 談到的 輸出的彈性.

3.SV_VertexID: dx10增加蠻多這種東西. 這就是一開始 vertex buffer, index buffer
你自己輸入的資料, 現在也公開 在 shader code可以使用

4. texture array: 彈性.

5.dx9無法將 zbuffer texture在pixel shader 裡面存取, dx10可以了.

===============

即使這些 對我也不是那麼夠.

輸出 沒有辦法指定位置: 就是指定在 render target 的位置.
輸出沒有: 3D座標, 無法voxel.

=====
要移植到dx10, 要多花時間, 又只綁 win7, 雖然ubisoft 已經是dx10了.
也代表 要跟這類的軟體 直接競爭.

也想直接跳到dx11, 可能明年底, 這樣dx10就沒用了. 浪費移植.


=====
結論不打算移值dx10, 但是找一些不需要dx10的特效. 但是還是要看dx10.
因為dx10跟 dx11差距較小.


3D程式? 你何去何從?

聽說unreal4 有更便宜的授權, 便宜的 code....

還有便宜的 unity3d, 更是橫掃低階的應用.


那我為何要繼續寫的3D引擎 何去何從?

人生無聊 總要找點事做.

3D的門檻 可以看成是小學 中學 高中 大學 博士.......

重點是你處在哪一個位置?

或者是 unreal4  unity3D處在哪一個位置?

unreal4  unity3D 只是能幫忙降低3D的門檻, 能降低多少門檻? 大學降到高中,

那你要使用unity, 總要有高中程度吧.


一個不會3D程式的程式人員, 即使使用unreal 4, 做出來的東西 一定比我還差.
 --->這應該不會有疑問吧.

=========================================

2年前 unity3D出來時 我認為他會像 flash一樣的流行.

但是過了2年後 也還好而已.
為什麼? 3D的門檻 遠超過你的想像, 所以我確定了 unity3d無法像  flash一樣的流行.

unity3D為何都是小遊戲在做? 沒有大遊戲?
那是他的目標訴求.
愈簡單的工具 愈容易使用的工具, 也同樣限制了他的使用範圍. 就是只能做簡單的遊戲.

遊戲不是單純一兩個元件組合起來就可.
 是要由很多元件 非常多的功能組在一起.
 unity每個元件都做得不錯, 但是一整合起來, 就會 速度超乎想像的慢.
而你將不會知道  bug在哪裡.
 這也就是unity大多小遊戲的原因.


==========

我的目標就是 賣自己的3D引擎, 提升遊戲的競爭力.

目前為止 不可能有人跟我花一樣的程式資源,能做到跟我相等的程度了.

=========

3D圖學的方向 簡單說 就是沒有完美的終點.
涉及的領域 又多又廣.

1.相當高程度的程式能力
2.圖學知識.
3.數學 物理  知識.

根本不會有一個人有辦法掌握這麼多的知識.

所以你可以找到自己的立足點.




這裡難道沒有人覺得 我程式寫得很快嗎?

這裡難道沒有人覺得 我程式寫得很快嗎?

1.因為我早在 dos時代就獨自完成 3D圖形引擎. 意思是我的基礎比你們深.

2.在windows剛出來時 就獨自完成一個簡單的大富翁遊戲,  並且想要拿自己完成的遊戲去賣了.
在10年前 我就開始賣3D程式碼了.

3. 因為我比你們更清楚 軟體開發的成本觀念, 要把力量時間用在對的方向.
所以我根本不會浪費時間 去學習一堆沒甚麼用的軟體技術, 像是 STL, public, vitrual....
我早就知道 這對軟體的開發 根本沒甚麼幫助.

4.簡單的例子 就像上面的 SSAO, 請問一下 你有評估過 要花多長的時間做 SSAO?
要做到甚麼樣的程度嗎?
在你們為SSAO爭吵時 我已經繼續寫下一個特效了.

軟體開發要有成本觀念


軟體開發要有成本觀念

1.我認為有30%的軟體開發 最終都沒有發行, 然後就結束了.
2.可能有高達9成以上的軟體開發 最後都會延誤.

為什麼?  軟體開發要有成本觀念.

軟體不是可以無限期的一直開發下去, 然後做出完美的軟體.

完美的軟體 根本不存在.

如果你是老闆看到錢一直投下去, 卻不知軟體何時會完成? 我看不頭痛才怪.

以為離你很遠? 那現在很多獨立遊戲的開發者, 那是不是要有成本觀念?

一款獨立小遊戲 可以寫一年? 寫完我看要破產了.

---------------

軟體開發者 可以考慮去接些案子, 對你開發軟體的成本觀念會有幫助的.

一般的案子就是 預算固定, 要寫的功能也是差不多固定.

然後你要評估 能不能接.
請問你怎麼評估?

1.先評估能不能做出來, 你對自己的能力不了解, 會做甚麼 不會做甚麼, 都不知道,
你要怎麼評估? 簽約下去 做不出來 是要賠錢的.

2.評估開發時間,案子是不能一直讓你無限期的做下去的. 時間不只是你的成本 也是發案者的成本. 上市日期....能不間內做出來.


3.上面兩個都有辦法後 最後才能評估利潤.

------------

甚麼是軟體開發的成本觀念?

這個功能 這個軟體要多久做出來, 做出來後 對使用者重不重要? 這就是成本效率觀念.
花大量的時間 做出使用者根本不需要的功能, 這就是浪費.

更簡單的問題: 你花大量的時間去學息一個新技術, 例如 STL, public, vitrual....
請問一下 這對你的軟體開發速度 有幫助嗎?
能更快的把軟體完成嗎?, 如果有幫助 那有多少幫助?

你自己評估一下成本, 就知道, 要不要花時間去學這些垃圾了.
結果只會出乎你的意料.
一點幫助都沒有.

---------
台灣的遊戲會完蛋, 就是完全沒有軟體成本觀念.

沒有哪種能力 無限的增加功能 硬要開發大型 online game, 最後導致延期 開發成本遽增.
最終出來的成品  又不滿意.

亂搞幾次 我看有哪個金主 敢繼續把錢投下去.







FXAA Anti-Aliasing

下載兩張圖 比較.

直接拿 nvidia的code來改, 以後寫程式這麼輕鬆就好.

就是edge blur跟亮度調整. 意思是會變獏糊跟變暗.
nvidia的控制台 就有這個選項. 只是在程式裡控制, 比較容易而已.
差別:nvidia的控制台 劃質比較好, 速度比較慢.
反正隨個人喜好.

======
現在的3D已經複雜到沒有paper寫不出來了.
即使有paper沒code, 還是有99%的機率寫不出來.
要是沒有nvidia或是 microsoft這些廠商,,,,,做這麼多研究, 寫出免費的code讓大家用.
3D遊戲的發展不可能這麼快.
所以就比誰的   shader code閱讀能力, 修改參數,  整合到遊戲的能力.

如果要比較 nvidia或是 microsoft 誰的 code寫的好?
很簡單, 就看你整合誰的code比較容易.
nvidia的sample code簡單 清楚,  很容易整合.
dx sdk的code, 感覺只是寫出來而已, 根本很難用. 很難看的懂到底是在寫甚麼.

如何判斷一個人的程式碼寫的好不好, 就是兩個標準:
容易修改 容易閱讀, 簡單的說 就是容易抄. 甚麼design pattern 也是屁.



簡單的說 就比誰的遊戲先做出來, 誰就搶商機.
遊戲開發超過2年, 失敗的機率只會急速爬升.




apple搞笑的 goto bug

最近很流行的:

 if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
        goto fail;
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
        goto fail;
        goto fail;
 if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
        goto fail;
apple軟體實力本來就很差, 寫出這種搞笑的bug不用太在意.
之前使用Xcode天啊, 這比10年前的 vc++還爛.
看一個開發工具很不好用, 看  debug就曉得.
在xocde裡面 在  debug模式 竟然 無法看到全域變數的數值?
把函數寫在class裡面, 在函數內設中斷點, 竟然進不進去?


我不喜歡用goto, 反而常用 return;
上面我會怎麼寫?

if( SSLHashSHA1.update()==ERROR ){  Release();   return FAIL: }
if( SSLHashSHA1.final()==ERROR  ){  Release();   return FAIL: }

對齊 都好看多了.
========

笨蛋才會用一堆奇怪的goto.
Dijkstra寫的內容也是其一貫的犀利語氣,文中說:「幾年前我就觀察到,一個程序員的品質是其程序中goto語句的密度成反比的」
===========
這就是我反對用 public, virtual, 過多的template.

愈是弱腳的就喜歡用一些奇奇怪怪的語法, 還有甚麼Boost? 連學 都懶的學.
你知道 STL的 vector 在push_back() 會呼叫  ~class() 嗎?
有一個 class A;    push_back(A); 會呼叫  ~A()  嗎?


如果你無法100%了解的東西就不用要用.

===============
 http://coolshell.cn/articles/11112.html

  • if (!p)    和  if (p == NULL)
  • if (p)    和  if (p != NULL)
  • if (!bflag)  和 if  (bflag == false)
  • if ( CheckSomthing() )  和 if ( CheckSomething() == true )
  •  
 要是我就一律規定 只能寫右邊的方式.

=========

現在我的程度 這種c++等級的bug, 對我已經沒有挑戰性了(當然只對我自己寫的code)

寫3D你才知道甚麼是困難.

3D哪種bug, 是你明知問題就在這裡,  很遺憾 你是無法解決.



Forward Rendering vs. Deferred Rendering

Forward Rendering:就是傳統的render.更簡單的說 是 world space rendering

Deferred Rendering: 這簡單的說就是 screen space rendering

更簡單的說: 類似一張一張很多2D的圖片 然後一直混在一起.

3D的redner原理  world space -> view space ->proj space ->clip space -> [screen space](Deferred Rendering 就是在這裡處理的)

這兩種各有優缺點:

world space rendering優點:  簡單明瞭. 一個一個obj的render.容易入門.

 缺點:1.因為資料都是建立在world space, 所以資料量很龐大.
已知的 lightmaping就是 world space render, 需要大量的記憶體來儲存lightmap.

2.如果處理的特效愈多 複雜度就愈高.

優點是:劃質質很穩定, 除了有鋸齒外的問題, 其他幾乎都不是什麼問題.


gpu運算要求較低, memory要求較高.

代表作品 : rage


screen space rendering:

優點:1.所需的資料很少, 最多就是幾個 screen space資料,
memory需求低,  但是很吃gpu的運算能力.

2.能夠簡化 render流程.  能把很複雜的劃面處理 簡化成幾張照片的處理方式.-->這應該是受歡迎的主要原因.


缺點: 入門檻高, 花大量的時間在做 image編碼的過程.
screen space 的數值不容易控制,  要花大量的時間處理閃爍的問題.


代表作品 :crysis




簡單一句話:

screen space rendering 能把複雜的東西變得很簡單, 但是簡單的東西卻變得很複雜.

world space rendering: 簡單的就是簡單 複雜的就是複雜


SSAO


兩張下載比較一下就曉得.

1.效果想做的明顯點 缺點也就會變得較明顯

2.Screen Spacce 有個致命的缺點, screen space會隨camera的改變 而改變,
導致數值很不穩定, ssao的部分當camera移動常會閃爍.

3.只用depth map, 速度超乎想像的理想, 跟之前的 soft particle:fog 差不多, 少掉16張左右.