Posts Tagged ‘ Shader

GPU學習小筆記0

關於坐標點和像素:

點的描述都是浮點值,但是熒幕上面的像素點都是整型的,如果一個點的坐標為(10.48,20.51),則實際上在熒幕上面的像素點位置為(10,21).

關於Z-buffer:

Z-buffer存儲的Z值並不是線性的,在正投影中Z值是線性的,但是在透視投影中卻是非線性的。且隨著視點到空間點的距離增加而非線性的關係越發明顯。為了減輕這情況,應該盡量設置進裁剪面和遠裁剪面的比率小於等於1000.

Shader Language與高級語言:

Shader Language被稱作高級語言,但是高級語言的一個特性是與硬體獨立,而Shader Language則是需要完全依賴於GPU硬體的,所以只能說:從在便攜性上,Shader Language是高級語言.

Programmable Vertex Processor和Programmable Fragment Processor合二為一:

在DirectX 9之前,Vertex Processor和Fragment(Pixel) Processor在GPU內部是獨立不同的硬體單元,分別運行頂點代碼片段和像素代碼片段。而在DirectX 10之後,GPU發生了巨變,Vertex Processor和Fragment Processor合二為一,不再是分離單獨的運算單元,變成了一個稱之為Stream Processor(Shader Core)流處理單元的東西。注意這裡我稱呼的是流處理單元而不是流處理器。因為一個Stream Processor在嚴格意義上來說並不能算作一個處理器,因為沒有取指和調度單元構成一個完整的前端.

上面的意思是說,一個Shader Core既可以做以前Vertex Processor功能,又可以做Fragment Processor的功能.

關於Streaming Multiprocessors:

而在多個Stream Processor(Shader Core)組成的一個Streaming Multiprocessors多流處理器,或許才能稱為一個完整的處理器,因為每一個Streaming Multiprocessors有獨立的取指和調度單元來構成前端。

Read more

XNA:粒子系統–雨效果3-開始掉坦克

在前面的一些內容,我已經構建了一個基本的粒子系統,儘管她還不能運動,現在讓我來完善她,讓她開始運動起來,也就是說,從天上掉下很多坦克下來.

之前我們是通過GPU實現,坦克自然是一個模型,通過Vertex Shader運算之後重新得到每個模型運動的位置.

注意,這裡用到了一個很笨拙的方法,逐個計算Tank模型每個頂點的位置,其實可以通過計算中心點坐標來減少計算量.

之前已經說過,計算目的地坐標的公式為:vt+g*t*t/2.

我們在Shader裡面設置全局變量:

float LifeTime;  //粒子生命時間
float InitialSpeed;  //初始速度
float Acceleration;  //加速度

然後計算坐標僅為:

inPos.y-=(LifeTime*InitialSpeed+(Acceleration*LifeTime*LifeTime)/2);
Output.Position = mul(inPos, preWorldViewProjection);

即可完成運動計算.

完整的Shader代碼:
Read more

HLSL 學習中

因為XNA的關係,所以Shader在裡面很常用的感覺,人家說使用了Shader之後能夠很短的代碼就能創造出很神奇絢麗的效果,於是開始學習HLSL,試試了一下,果然讓人驚訝.

頂點著色器Vertex Shaders的輸出結果就是像素著色器Pixel Shaders的輸入結果,這句話說的太直觀了.

頂點著色器Vertex Shaders可以被CPU模擬,如果你的GPU不支持的話,但是像素著色器Pixel Shaders就不能被CPU模擬.

在使用頂點著色器的時候有個小小的思考,我們的CPU在遍歷一個模型mesh或者圖元所有的頂點數據之後,再傳遞給頂點著色器,頂點著色器經過運算之後傳遞給像素著色器。這個時候就帶來一個問題,經過頂點著色器運算之後的頂點數據,CPU不知道了,也就是說,我們的程式不知道現在頂點是移動到什麼地方去了,儘管我們的眼睛可以看到。如果這樣,我們要做非常精確的碰撞檢測(不使用包圍體,當然這是一種理想的情況),這樣我們就無法得知每一個頂點精確位置了.

下面的代碼:
Read more

return top