DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1142|回复: 0
打印 上一主题 下一主题

[待整理] 现代显卡GPU pixel shader小程序合集

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-13 09:25:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
前言  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等,不太好说,但绝对不支持低端系统。视频特效无止境,硬件越高级越好
  软件:DX9.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<=1; i++)
  {
  for(int j=-1; j<=1; j++)
  {
  float4 pcur = tex2D(s0, tex.xy + float2(i/width, j/height));
  float lcur = luma(pcur);
  if (lcur < lmin) { lmin = lcur; pmin = pcur; }
  if (lcur > 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;
  }
  }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2025-7-28 02:41 , 耗时 0.090854 秒, 21 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表