亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++ HLSL實現簡單的圖像處理功能

2020-01-26 14:14:52
字體:
來源:轉載
供稿:網友

由于對于dxva2解碼得到的數據不宜copy回內存給CPU處理,所以最好的辦法是在GPU上直接進行處理。D3D的像素著色器能夠對像素直接進行操作,實現點運算極其簡單方便,簡單的卷積運算效果也非常好。但D3D9的限制也很多,對于過于復雜的圖像處理則顯得有些不能勝任。

1.點運算

點運算用HLSL非常容易實現,幾乎是公式怎么寫,代碼就怎么寫。以RGB轉灰度圖顯示為例:

texture Tex0 ;int iFlag = 0 ;float aValue= 0.0 ;float bValue= 0.0 ;sampler2D YTex = sampler_state{  Texture = <Tex0> ;  MipFilter = LINEAR ;  MinFilter = LINEAR ;  MagFilter = LINEAR ;  AddressU = CLAMP ;  AddressV = CLAMP ;};struct PS_INPUT{  float2 uvCoords0 : TEXCOORD0 ;};float4 Main( PS_INPUT input ) : COLOR0{  float4 yuvColor ;  //rgb to gray 不知道是不是這么顯示的,姑且這么認為  float gray = tex2D( YTex, input.uvCoords0 ).r * 0.299 + tex2D( YTex, input.uvCoords0 ).g * 0.587 + tex2D( YTex, input.uvCoords0 ).b * 0.114 ;  float s = 0 ;  if(iFlag == 0)  {    s = aValue * gray + bValue/255 ;  }  else if(iFlag == 1)  {    s = aValue * log(1+gray) ;  }  else if(iFlag == 2)  {    s = aValue * pow(abs(gray),bValue) ;  }  yuvColor.r = s ;  yuvColor.g = s ;  yuvColor.b = s ;  yuvColor.a = 1.0 ;  return yuvColor ;}

點運算如此簡單是因為GPU是并行運算的,我個人認為可以看成是每一個像素點(BGRA)對應一個線程,這大概就是OpenCL中所謂的數據并行。這是一個非常簡單的程序,指令數少,程序結構也很簡單,shader 的版本用2.0就可以輕松編過。

2.卷積運算舉例

指令數較多的情況2.0版本的shader就搞不定了,上3.0版本可以做一些簡單的卷積運算。以中值濾波為例:

texture Tex0 ;matrix WorldMatrix;matrix ViewMatrix;matrix ProjMatrix;sampler2D YTex = sampler_state{  Texture = <Tex0> ;  MipFilter = LINEAR ;  MinFilter = LINEAR ;  MagFilter = LINEAR ;  AddressU = CLAMP ;  AddressV = CLAMP ;};struct VS_INPUT {  float4 pos  : POSITION;  float4 color : COLOR0;  float2 tex  : TEXCOORD0; };// struct VS_OUTPUT {  float4 pos   : POSITION;  float4 color  : COLOR0;  float2 tex   : TEXCOORD0; };float2 g_v4ScreenSize;int ksize = 1 ;float fLeft = -1.0f ;float fTop = -1.0f ;float fRight = -1.0f ;float fBottom = -1.0f ;//--------------------------------- BurTechnique --------------------------------------VS_OUTPUT MainVS_Screen( VS_INPUT In ){  VS_OUTPUT Out = ( VS_OUTPUT )0;  float4x4 matWorldView = mul(WorldMatrix,ViewMatrix);  float4x4 matProject = mul(matWorldView,ProjMatrix);  Out.pos = mul(In.pos,matProject);  Out.tex = In.tex;  Out.color = In.color;  return Out;}float4 MainPS_Screen( VS_INPUT In ) : COLOR0{  float4 outColor = tex2D( YTex, In.tex ).rgba ;  if(ksize <= 1 || ksize%2 == 0)  {    return outColor ;  }  if( ksize > 11 || ksize < 3)  {    return outColor ;  }  if(!(In.tex.x < fRight && In.tex.y < fBottom && In.tex.x > fLeft && In.tex.y > fTop))  {    return outColor ;  }  // 紋理大小  float2 TexSize = float2( g_v4ScreenSize.x , g_v4ScreenSize.y );  float x_off = 1.0f / TexSize.x;  float y_off = 1.0f / TexSize.y;  float2 fX0Y0 = In.tex - float2(x_off * ksize/2, y_off*ksize/2) ;  float3 sum = {0.0f, 0.0f, 0.0f} ;  if(ksize >= 3)  {    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*2)).rgb;  }  if(ksize >= 5)  {    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*4)).rgb;  }  if(ksize >= 7)  {    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*6)).rgb;  }  if(ksize >= 9)  {    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*8)).rgb;  }  if(ksize >= 11)  {    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 9, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*0)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*1)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*2)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*3)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*4)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*5)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*6)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*7)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*8)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 10, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*9)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 0, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 1, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 2, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 3, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 4, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 5, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 6, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 7, y_off*10)).rgb;    sum += tex2D( YTex , fX0Y0 + float2(x_off * 8, y_off*10)).rgb;  }  outColor = float4(sum/(ksize*ksize),1.0f);  return outColor ;}//--------------------------- 技術---------------------------technique BurTechnique{  pass P0  {      LightEnable[0] = false;    VertexShader = compile vs_3_0 MainVS_Screen();    PixelShader = compile ps_3_0 MainPS_Screen();  }}

由于3.0版本的shader似乎不允許pixel shader單獨出現,所以我從點運算用像素著色器實現改為用特效來實現。HLSL語法中有if語句,也有for語句,可是這個程序卻不厭其煩的把所有的都給列出來來,而沒有使用for循環。這是因為在實際使用中發現有一些限制,比如if語句的if(A>B),A與B中必須有一個是常量,就像上面見到的那種形式;for循環中間的判斷也是如此,只是在第二層j循環中可以是第一層循環的i,即不可以

 for(int i=0;i<ksize;i++){  for(int j=0;j<ksize1;j++)    {  ..........    }}

以上代碼的ksize與ksize1都必須為常數,例外的情況是ksize1可以為第一層循環的 i 。這個問題不知道后續版本的shader有沒有,反正我當前使用的版本有。

另外有一個需要注意的地方是指令數,2.0版本的shader支持的指令數相當少,3.0版本則要多好多,我最長寫到了400多條快500條時才導致編譯失敗。 還有一個需要提醒的是3.0版本的shader只支持D3D 9.0C以后的。如果要求做更為復雜的圖像處理,可以的話建議上D3D11,compute shader雖然我沒用過,但從介紹來說,應該可以處理一些更為復雜的圖像處理。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品一区二区三区在线视| 成人日韩在线电影| 亚洲色图校园春色| 中文字幕在线看视频国产欧美在线看完整| 69久久夜色精品国产7777| 国产在线视频不卡| 亚洲成人网av| 午夜欧美不卡精品aaaaa| 欧美激情xxxxx| 欧美大尺度电影在线观看| 97国产精品视频人人做人人爱| 国产激情视频一区| 38少妇精品导航| 久久精品视频在线播放| 国产a∨精品一区二区三区不卡| 清纯唯美亚洲综合| 青青久久aⅴ北条麻妃| 国产精品99久久久久久白浆小说| 91在线色戒在线| 欧美激情视频三区| 日韩av电影在线免费播放| 久久精品国产清自在天天线| 欧美在线亚洲一区| 91在线直播亚洲| 久久九九全国免费精品观看| 97超碰国产精品女人人人爽| 成人中心免费视频| 精品国产91久久久久久老师| 亚洲人成网站777色婷婷| 色av吧综合网| 欧美专区在线播放| 免费av在线一区| 国产综合视频在线观看| 欧美老女人性生活| 国产精品久久久久免费a∨| 亚洲女人天堂av| 欧美成人精品h版在线观看| 热久久这里只有精品| 国产精品久久久久久久7电影| 欧美性猛交99久久久久99按摩| 粗暴蹂躏中文一区二区三区| 日韩免费av在线| 日韩欧美国产网站| 欧美日韩第一视频| 久久久国产一区二区三区| 欧美一级电影免费在线观看| 国产精品小说在线| 日韩中文理论片| 亚洲国产中文字幕久久网| 欧洲美女7788成人免费视频| 精品国内自产拍在线观看| 久久成年人免费电影| 亚洲一区二区三区sesese| 精品自拍视频在线观看| 欧美视频国产精品| 欧美激情视频播放| 欧美—级a级欧美特级ar全黄| 欧美日韩爱爱视频| 亚洲乱码一区二区| 精品欧美国产一区二区三区| 91老司机精品视频| 中文在线不卡视频| 久久精品久久久久久国产 免费| 国产精品久久久久久久天堂| 亚洲视频免费一区| 欧美性高跟鞋xxxxhd| 欧美激情a在线| 中文欧美在线视频| 欧美精品在线视频观看| 成人日韩在线电影| 国产成人精品在线视频| 国产精品久久久久久久久粉嫩av| 日本三级久久久| 91伊人影院在线播放| 亚洲午夜小视频| 91在线免费看网站| 国产精品久久久久久久久久东京| 精品亚洲男同gayvideo网站| 亚洲精品久久久久国产| 精品视频在线导航| 久久九九亚洲综合| 黄色成人在线免费| 国产一区二区丝袜高跟鞋图片| 最近2019年好看中文字幕视频| 欧美在线观看网站| 亚洲综合在线中文字幕| 尤物99国产成人精品视频| 久久免费精品视频| 亚洲激情电影中文字幕| 日韩在线小视频| 亚洲精品视频在线观看视频| 91免费版网站入口| 欧美成年人网站| 欧美激情日韩图片| 欧美国产日韩免费| 国产精品久久久久7777婷婷| 青草青草久热精品视频在线网站| 国产精品高精视频免费| 欧美小视频在线| 久久久伊人欧美| 国产精品黄色av| 在线日韩精品视频| xxx一区二区| 欧美国产日韩在线| 国产精品久久久久久久久久| 欧美一级免费视频| 影音先锋欧美在线资源| 日韩中文字幕免费看| 一区二区三区久久精品| 国产精品夫妻激情| 亚洲一区二区三区视频| 亚洲最新视频在线| 久久久久久97| 日韩高清av在线| 日本在线观看天堂男亚洲| 精品久久久在线观看| 日本电影亚洲天堂| 国产精品久久久久久av福利软件| 亚洲女人天堂视频| 亚洲欧美日韩直播| 欧美—级高清免费播放| 日韩美女在线观看一区| 久久久久女教师免费一区| 国产精品久久久久av| 91精品国产色综合| 亚洲欧洲在线观看| 亚洲欧美制服另类日韩| 国产成人97精品免费看片| 色婷婷亚洲mv天堂mv在影片| 久久九九亚洲综合| 最好看的2019年中文视频| 国产性猛交xxxx免费看久久| 欧美美女15p| 2019中文在线观看| 国产成人精品一区| 国产精品视频1区| 日韩www在线| 久久精彩免费视频| 国产日韩中文字幕在线| 浅井舞香一区二区| 97视频在线免费观看| 成人欧美一区二区三区黑人| 成人激情视频免费在线| 国产精品美腿一区在线看| 欧美激情中文字幕乱码免费| 欧美在线播放视频| 亚洲999一在线观看www| 亚洲欧美国产精品久久久久久久| 91老司机在线| 6080yy精品一区二区三区| 欧美激情在线有限公司| 亚洲成人aaa| 亚洲女在线观看| 亚洲国产天堂网精品网站| 欧美精品做受xxx性少妇| 久久精品视频在线观看| 亚洲qvod图片区电影| 国产在线日韩在线| 亚洲无线码在线一区观看| 国产精品天天狠天天看| 国产精品美女av| 欧美激情一区二区三区成人| 欧美大学生性色视频| 亚洲精品久久久久久久久久久久久|