Direct3D提高篇:HLSL编程实现PhotoShop滤镜效果

45 篇文章 1 订阅

一、图像黑白化

一个RGB颜色的亮度和各个分量之间的关系的公式为:

       GrayValue = 0.3 * R + 0.59*G + 0.11 *B

根据这个公式,代码如下:

sampler2D Texture0;

float4 ps_main( float2 texCoord  : TEXCOORD0 ) : COLOR
{
   float4 _inColor 
= tex2D( Texture0, texCoord );
   
float h = 0.3*_inColor.x + 0.59*_inColor.y + 0.11*_inColor.z;
   float4 _outColor 
= float4(h,h,h,1.0);
   
   
return _outColor;
}

二、浮雕




"浮雕"图像效果是指图像的前景前向凸出背景。常见于一些纪念碑的雕刻上,要实现浮雕其实非常简单。把图像的一个象素和左上方的象素进行求差运算,并加上一个灰度。这个灰度就是表示背景颜色。这里设置这个插值为128 (图像RGB的值是0-255)。同时还应该把这两个颜色的差值转换为亮度信息,否则浮雕图像会出现彩色J

在使用HLSL处理浮雕效果的时候,两个问题我们需要注意一下。

其中一个是图像边界问题,写过类似实现的朋友都知道,在处理边界象素的时候可能是取不到左上角象素的。这个时候就应该做特殊处理,通常把边界位置的浮雕结果设置成背景颜色。但是使用HLSL的时候不需要在HLSLshader中去对图像的边界做特殊处理,而需要对纹理设置滤波器, 这个滤波器设置为CLAMP模式就可以了。

第二个需要处理的问题是, PixelShader中纹理的采样坐标是0-1.0 如果要取到左上纹理图像的大小,这样才能把一个象素的的偏移转换成0-1.0的值。假设纹理的大小是[w,h],当前纹理坐标是[u,v],那么图片左上角的象素的纹理坐标就是[u -1.0/w, v – 1.0/h]RenderMonkey中无法知道这个纹理图像的大小。如果完全用VC++来实现的话,可以在加载图像或者从IDirect3DTexture9对象中得到纹理大小,然后当作一个constant常量设置给HLSL就可以了。或者假设纹理的大小就是1024 x 1024—得到的效果也是可以接受的.






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值