1.1 序言
以前一直覺得,學習shader最好是在visual studio的環境下進行學習,因為這樣不僅能夠學到directx和c++的一些使用方法,而且對於shader在實際應用時也有好處.結果今天就碰得灰頭土臉的.
1.2 碰壁過程
下面是我的程式段:
id3dxeffect* g_peffect = null;
3dxcreateeffectfromfile( g_pd3ddevice, "******.fx", null, null, dwshaderflags, null, &g_peffect, null );
下面是我的.fx程式:
float4x4 worldviewproj : worldviewprojection;
float4 mainvs(float3 pos : position) : position
float4 mainps() : color
technique technique0 }
編譯的時候沒有提示錯誤,也可以執行.但是在執行中出錯,沒有出錯的資訊.
對於幾乎沒有在vs c++環境下程式設計的我來說.這是非常抓狂的事情.在網上找了下**,把我的程式改了一下,可以看到錯誤資訊了.下面是修改後的程式段
id3dxbuffer* error_buffer;
hr = d3dxcreateeffectfromfile( g_pd3ddevice, "******.fx", null, null, dwshaderflags, null, &g_peffect, &error_buffer );
if(error_buffer)
if(failed(hr))
下面是出錯的資訊:
看不清楚?這裡檢視原圖(大圖)。
大概是說現在ps_1_x的版本不被支援了.於是乎,我想到,如果還有一些其他的疑難雜症,如果我想除錯shader,如果我想很快的能夠在修改shader後,把matieral賦值,如果我想方便的建立view和projection矩陣.那vs顯然是不能勝任的.
花了點時間找了找.使用nvidia的 fx composer 2.5是乙個很好的選擇.它支援d3d10,而且有乙個類似於3dmax的視窗,可以拖動物體,這樣也不用很麻煩的去建立view和projection矩陣.操作也很方便,比ati的那個工具感覺還好一點.用來學習shader是很不錯的選擇(廣告啊)
在nvidia的**上可以方便的下到它
com/tools/shader_debugger/fx_composer2_shader_debugger_bundle_2.51.0827.1525.exe
安裝時注意要選擇no commercial,這樣就不會被要求輸入序列號了.
1.3 建立我們的第乙個shader
選擇file-new project:
step 1: 選擇
step 2: 選擇
step 3: 把白圓拖動到右下角的球上,把特效和物體關聯,這個特效檔案的執行效果如下:
是不是感覺到非常的」所見即所得」?
如果你想看看這個shader檔案,在白圓上面按右鍵,選擇edit,顯示出的就是.fx檔案的源程式,把這個程式複製到vs裡面,進行了相關了初始化和設定引數操作後,也可以正常了使用了.
fx composer 2.5的其他情況你也可以自己看看安裝後的幫助檔案,我這裡就不說太多了(其實我也是今天才開始用的,以後有了心得再慢慢寫出來 :-d)今後的重點主要放在shader的編寫上.
2.1 為我們的shader增加貼圖
step 1: 在我們的empty effect中:
float4x4 worldviewproj : worldviewprojection;
下面一行按右鍵,選擇」insert snippets」
在右邊的框中選擇」texture and sampler」
在打了乙個框的name上面雙擊,修改為diffuse,這樣所有的」name」就自動變為了」diffuse」了
step 2: 新增程式段,使得**變為
float4x4 worldviewproj : worldviewprojection;
texture diffuse <
string resourcename = "";//optional default file name
string uiname = "diffuse texture";
string resourcetype = "2d";
>;
sampler2d diffusesampler = sampler_state ;
struct vs_output
;vs_output mainvs(float4 pos : position,float2 tex : texcoord0)
float4 mainps(float2 tex : texcoord0) : color
technique technique0
}step 2:選擇我們的empty effect檔案,在右上方的property **的 parameter中的」diffuse texture」選項中選擇乙個你喜歡的貼**件.
step 3:按下ctrl + f7,編譯shader,然後把這個shader拖動到我們需要顯示的物體上面
2.2 解釋**的含義
texture diffuse <
string resourcename = "";//optional default file name
string uiname = "diffuse texture";
string resourcetype = "2d";
>;
可能很多人對**中 < … > 中的內容感覺到很茫然,其實這些內容對我們directx中使用來說用處不大,主要作用是使得fx composer可以識別出我們的引數,並且在引數面板中顯示,方便我們修改
return tex2d(diffusesampler, tex);
根據diffusesample取樣器,對tex所對應的貼圖座標進行插值運算,如果你對這塊**理解不清楚,請自己找本hlsl相關的書籍看看.第一章開頭的引用數目或許對你有幫助
2.3 執行效果
**:
shader學習心得
概論 很早就聽說過shader,作為計算機圖形渲染的重要的流程之一,乙個月前也是想找有關相關書籍寒假來入門入門圖形學這個大坑,有幸找到女神的這本 unity shader入門精要 從今天開始來寫一寫學習這本書的一些心得,作為自己的學習筆記。shader目前在國內發展還是剛起步,一些資料還不完全,這也...
學習心得 python學習心得
自從來了深圳工作以後,尤其是屢屢面試碰壁以後。發現其實自己的知識面很窄,做筆試題的時候絞盡腦汁還是漏洞百出,並不是不會做,而是出現一大堆不該有的失誤。每次被問道,對資料庫了解嗎?說一大堆看起來很高階的東西 好啊,那我們寫幾個sql語句吧。馬上完蛋了,沒了手冊關鍵字都記不起。了解哪幾種指令碼語言,sh...
學習心得 我的學習心得
我是乙個已經步入中年的70後,離開校園已經20年了,因為當年的政策因素而未能圓我的大學夢,在20年的工作過程中總是因為缺少一張大學文憑而失去了很多機會,曾經也考慮過自考,但是乙個人去面對的時候總感覺心有餘而力不足。2018年3月份偶然讓我認識了尚德,原來自考還可以這樣學習。一直懷疑自己年紀大了記憶力...