前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于屏幕像素抖动的PCF

基于屏幕像素抖动的PCF

作者头像
逍遥剑客
发布2019-02-20 16:02:13
9310
发布2019-02-20 16:02:13
举报

PCF无非就是把周围的像素加吧加吧, 然后取个平均值. 结果的平滑程度, 跟Kernel的大小有直接关系.

下面来对这个描过边的锯齿茶壶PCF一把:

2x2:

3x3:

4x4:

当然, Kernel越大, 效果越好. 但大到一定程度效果就不明显了, 而且还要考虑性能问题, 毕竟多次的纹理采样很慢. 其实呢, 通过抖动也可以使用少量的采样达到近似比较大Kernel的效果. 这里用4次采样来模拟4x4PCF的效果, 采样模板如下:

正好PS3.0中的增加了一个寄存器VPOS, 用于直接取当前像素的屏幕坐标, 根据坐标的奇偶性来决定取样的位置:

代码语言:javascript
复制
sampler2D Texture0;
float2 fInverseViewportDimensions;

struct PS_INPUT
{
   float2 texCoord : TEXCOORD0;
   float2 screenPos : VPOS;
};

float4 ps_main(PS_INPUT input) : COLOR0   
{
   float2 offset = fmod(input.screenPos, 2.0);
   
   float4 color = 0;
   color += tex2D(Texture0, input.texCoord + (float2(-1.5,-1.5) + offset) * fInverseViewportDimensions);
   color += tex2D(Texture0, input.texCoord + (float2(-0.5, 0.5) + offset) * fInverseViewportDimensions);
   color += tex2D(Texture0, input.texCoord + (float2(-1.5, 0.5) + offset) * fInverseViewportDimensions);
   color += tex2D(Texture0, input.texCoord + (float2(-0.5, 1.5) + offset) * fInverseViewportDimensions);
   color *= 0.25;
      
   return color;   
}  

最终效果, 用在阴影模糊中会很一种效率很高的解决方案:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2009年12月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档