由于对于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虽然我没用过,但从介绍来说,应该可以处理一些更为复杂的图像处理。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# C++
# 图像处理
# C++采用TLS线程局部存储的用法实例
# C++实现简单的ls命令及其原理
# 为例
# 有一个
# 第一层
# 的是
# 是在
# 也有
# 是因为
# 就像
# 最好的
# 多好
# 中有
# 这个问题
# 着色器
# 这是一个
# 也很
# 我没
# 还有一个
# 较多
# 非常好
相关文章:
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
制作网站的基本流程,设计网站的软件是什么?
建站之星安装提示数据库无法连接如何解决?
番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?
建站之星安装后如何自定义网站颜色与字体?
如何通过万网虚拟主机快速搭建网站?
宝塔面板如何快速创建新站点?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
如何挑选最适合建站的高性能VPS主机?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
贸易公司网站制作流程,出口贸易网站设计怎么做?
如何在阿里云通过域名搭建网站?
如何选择域名并搭建高效网站?
建站之星后台密码遗忘?如何快速找回?
建站上市公司网站建设方案与SEO优化服务定制指南
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何在IIS中新建站点并配置端口与物理路径?
企业微网站怎么做,公司网站和公众号有什么区别?
太原网站制作公司有哪些,网约车营运证查询官网?
Thinkphp 中 distinct 的用法解析
建站org新手必看:2024最新搭建流程与模板选择技巧
建站之星3.0如何解决常见操作问题?
建站主机如何安装配置?新手必看操作指南
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
家庭建站与云服务器建站,如何选择更优?
如何在Windows虚拟主机上快速搭建网站?
TestNG的testng.xml配置文件怎么写
,有什么在线背英语单词效率比较高的网站?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
南京网站制作费用,南京远驱官方网站?
建站之星如何保障用户数据免受黑客入侵?
高防服务器租用指南:配置选择与快速部署攻略
建站主机服务器选型指南与性能优化方案解析
如何选择服务器才能高效搭建专属网站?
如何构建满足综合性能需求的优质建站方案?
表情包在线制作网站免费,表情包怎么弄?
如何在阿里云购买域名并搭建网站?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
如何快速搭建安全的FTP站点?
建站上传速度慢?如何优化加速网站加载效率?
网站制作模板下载什么软件,ppt模板免费下载网站?
如何快速重置建站主机并恢复默认配置?
如何在建站之星绑定自定义域名?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
公司网站制作需要多少钱,找人做公司网站需要多少钱?
建站主机SSH密钥生成步骤及常见问题解答?
制作网站的模板软件,网站怎么建设?
已有域名和空间如何快速搭建网站?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。