前言 Pixel Shader是現代顯卡GPU的編程語言,可以用于對屏幕輸出圖像里的每個象素點進行精確的色彩調整。大型三維游戲里面大量采用了Pixel Shader和它的伙伴,Vertex Shader,用于控制各種復雜的場景。 視頻播放通常被認為是2D應用,實際上現在的視頻播放已經是部分借助于顯卡的3D渲染管線來實現的(VMR7、VMR9等渲染模式),使用Pixel Shader可以對最終輸出的視頻圖像進行進一步修正和增強,達到更佳的畫面質量,也更充分的發揮顯卡(尤其是高端顯卡)被閑置的能力。 背景介紹:HiVi燒友已經開始廣泛使用ffdshow里面提供的倍線銳化等后期處理濾鏡于播放DVD, 尤其是使用投影儀輸出時。這些濾鏡能夠大幅提升DVD的欣賞品質,達到接近HDTV的效果。但是,同樣的方式卻不能用于HDTV播放上,原因很簡單,因為HDTV的分辨率大大提高,做同樣的后期處理,對CPU的要求高了很多,再加上視頻解碼處理也需要由CPU來負責完成(硬件解碼的限制),現有的CPU基本無法勝任這樣的工作,導致無法流暢播放。而與此同時,顯卡GPU卻屬于基本閑置狀態。 軟硬件需求 硬件:支持PS1.4或更高的顯卡,N卡為FX5200以上,A卡為8500以上(不含9100). 至于CPU等,不太好說,但絕對不支持低端系統。視頻特效無止境,硬件越高級越好 軟件X9.0, 播放軟件需要支持Pixel Shader編程。已知的有Media Player Classic 6.4.8.4 或KMPlayer。但KMPlayer尚有點問題,MPC是目前唯一可用的播放器。 MPC里面使用Shader的辦法 1. MPC6.4.8.4播放設置調整,修改渲染器設置。除此以外,你還要把解碼器等濾鏡進行相應調整,在此就不再贅述。試驗一下播放是否正常 2. 啟動MPC里面的Shader編輯程序 3. 輸入shader程序并保存為你喜歡的名字,注意屏幕下方的提示,必須成功才有用。圖片里的程序僅為示例。 4. 再次播放影片,并使用你剛才輸入的shader程序,看看有什么效果 以下列舉為可用的shader程序 消除1080i的白條,要求ps1.4 sampler s0 : register(s0); float4 p0 : register(c0); #define height (p0[1]) float4 main(float2 tex : TEXCOORD0) : COLOR { float h = 1080.0f/1088.0f; float4 pixel = tex2D(s0,tex); float4 fill = float4(0,0,0,0); if(height == 1088 && tex.y >=h ) pixel = fill; return pixel; } xsharpen濾鏡(完整版),適用于支持ps3.0的顯卡,如NVIDIA 6xxx系列卡. 對于ATI X系列卡等也許也可以用 可以自行修改strength/threshold的值 sampler2D s0 : register(s0); float4 p0 : register(c0); #define width (p0[0]) #define height (p0[1]) float luma(float4 color) { float4 lum = {0.21484375, 0.7109375, 0.07421875, 0}; return dot(color, lum); } float4 main(float2 tex : TEXCOORD0) : COLOR0 { float strength = 1.0f; //min 0.0f, max 1.0f float threshold = 1.0f; //min 0.0f, max 1.0f float4 pmin, pmax,porg; float lmin = 1.0f, lmax = 0.0f,lorg; for(int i=-1; i lmax) { lmax = lcur; pmax = pcur; } if(i==0 && j==0) { porg = pcur;lorg=lcur;} } } if(lorg-lmin > lmax-lorg) { if(lmax-lorg < threshold) return pmax*strength+porg*(1-strength); else return porg; } else { if(lorg-lmin < threshold) return pmin*strength+porg*(1-strength); else return porg; } } |