GPU Gems1 - 24 高质量的过滤

在一些应用中,高质量的过滤是至关重要的,可以用像素shader代码执行任何过滤。GPU着色程序不用于CPU的主要之处在于:一般来说,CPU数学操作比纹理访问更快,而在GPU中恰恰相反。图像过滤的目的很简单:对于给你的输入图像A,我们想要创建新的图像B。把源图像A变换到目标图像B的操作就是图像滤波。最一般的变换是调整图像大小,锐化,变化颜色,模糊图像等。

源像素的图案和它们对图像B像素的相对贡献,就称为过滤核心(kernel)。把核心应用到源图像的过程叫做卷积。如果核心只是把像素简单的进行平均,我们称这个模型为盒式滤波器。

我们可以把kernel作为参数直接代入shader,如下图所示及代码所示。

fig24-01.jpg
中心在W11的3x3过滤核心

 

float4 convolve3x3PS(vertexOutput IN,uniform sampler2D ColorMap,uniform float W00, uniform float W01, uniform float W02,uniform float W10, uniform float W11, uniform float W12,uniform float W20, uniform float W21, uniform float W22,uniform float Sum,uniform float StepHoriz,uniform float StepVert) : COLOR
{float2 ox = float2(StepHoriz, 0.0);float2 oy = float2(0.0, StepVert);float2 PP = IN.UV.xy - oy;float4 C00 = tex2D(ColorMap, PP - ox);float4 C01 = tex2D(ColorMap, PP);float4 C02 = tex2D(ColorMap, PP + ox);PP = IN.UV.xy;float4 C10 = tex2D(ColorMap, PP - ox);float4 C11 = tex2D(ColorMap, PP);float4 C12 = tex2D(ColorMap, PP + ox);PP = IN.UV.xy + oy;float4 C20 = tex2D(ColorMap, PP - ox);float4 C21 = tex2D(ColorMap, PP);float4 C22 = tex2D(ColorMap, PP + ox);float4 Ci = C00 * W00;Ci += C01 * W01;Ci += C02 * W02;Ci += C10 * W10;Ci += C11 * W11;Ci += C12 * W12;Ci += C20 * W20;Ci += C21 * W21;Ci += C22 * W22;return (Ci/Sum);
}

通过辅助图像,我们可以进行优化。充分利用纹理中的rgba通道,可以调用一个tex2D函数访问四个相邻像素而不必调整纹理索引。现在的卷积shader变得很短:

float4 convolve3x3GrayHPS(vertexOutput IN,uniform sampler2D GrayMap,uniform sampler2D NeighborMap,uniform sampler2D CornerMap,uniform float W00, uniform float W01, uniform float W02,uniform float W10, uniform float W11, uniform float W12,uniform float W20, uniform float W21, uniform float W22,uniform float Sum) : COLOR
{float gray = tex2D(GrayMap, IN.UV).x;float4 ntex = tex2D(NeighborMap, IN.UV);float4 ctex = tex2D(CornerMap, IN.UV);float Ci = ctex.x * W00;Ci += ntex.z * W01;Ci += ctex.y * W02;Ci += ntex.x * W10;Ci += gray * W11;Ci += ntex.y * W12;Ci += ctex.z * W20;Ci += ntex.w * W21;Ci += ctex.w * W22;return (Ci/Sum).xxxx;
}

本文随后介绍了双立方过滤等其他过滤技术以及反走样的理论,这里就不细讲了。

fig24-04a.jpg

 

fig24-05.jpg
双立方过滤的核心函数

可以写一个函数为每个采样像素计算过滤值,但是因为在过滤范围中不需要高频精度,所以查询表就能工作得很好,可以简单地把这些数值写进小的浮点纹理,不但精度适当,而且查询速度快(典型的空间换时间)。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021-04-05

见缝插针小游戏 结束动画 我们的结束动画很简单,就是把画面放大,把背景改成红色,再有一个停顿就可以了 1、对于放大画面和修改背景颜色的操作,在这里可以直接修改相机设置 我们要获取到Hierarchy窗口中的Main Camera,…

GPU Gems1 - 26 OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)

【章节概览】 这章中,大名鼎鼎的工业光魔公司的Florian Kainz、Rod Bogart和DrweHess介绍了OpenEXR标准,这是一种当时新的高动态范围图像(HDRI)格式,在计算机成像的顶级电影中正在快速推广。对于基于图像照明的开发者…

2021-04-08

unity入门教程 创建开始界面 在场景中创建画布Canvas,然后制作开始界面。 首先在Canvas下新建一个空物体,命名为StartWnd。然后在StartWnd下新建一个Image,命名为imgTitle,SourceImage使用main图片。然后在StartWnd下新建一个Butt…

ID Tech 5 中Megatexture针对地形的D3D9 基本实现原理

看GPU Gems2中的 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)一文,对Clipmap技术不是理解很好,所以上网搜索一番,发现了这篇文章,实在是太棒的文章&#xff…

2021-04-12

异步传输(Asynchronous Transmission):异步传输模式(Asynchronous Transfer Mode,缩略语为ATM) 异步传输一般以字符为单位, 起始位:先发出一个逻辑”0”信号,表示传输字符的开始。 空闲位:处于逻…

[知乎] 开放世界游戏中的大地图背后有哪些实现技术?

今天看到的一篇关于大世界的技术文章,写的太好了,膜拜大佬。各位如果有时间一定要看看 原文:http://gulu-dev.com/post/2014-11-16-open-world#toc_10 一、程序技术篇:算法和架构(Programming Algorithms & Arch…

角色控制器

一、简介 角色控制器(Character Controller)主要用于对第三人称或第一人称游戏主角的控制。 二、基本概念 第三人称游戏中的这些控制器由于无规律可循,所以无法遵守固定的物理规则,例如,让某辆车每小时跑 90 英里,但是它可能会突…

unity声音组件AudioSource的使用

一、AudioSource组件 AudioSource是音频源组件,其作用就是用于播放音频剪辑(AudioClip)资源。组件属性 (1)AudioClip(音频剪辑):指定播放的音频文件。 (2)O…

GPU Gems2 - 2 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)

【章节概览】 本章描述了一种通过顶点纹理实现的,基于GPU的几何体裁剪图(Geometry Clipmaps)技术。通过把地形几何体当做一组图像来处理,可以在GPU上执行几乎所有的计算,因此可以减少CPU的负载。且该技术较为容易实现…

协程

协程介绍 协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈,局部变量和指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个…

球谐光照

一.原理 球谐光照实际上是一种对光照的简化,对于空间上的一点,受到的光照在各个方向上是不同的,也即各向异性,所以空间上一点如果要完全还原光照情况,那就需要记录周围球面上所有方向的光照。注意这里考虑的周围环境往…

overload、override、new解释

重载、重写、覆写,分别指的是overload、override、new。 一、override重写,是在子类中重写父类中的方法,两个函数的函数特征(函数名、参数类型与个数)相同。用于扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟…

图像色调,饱和度,对比度等相关定义

RGB颜色模型 RGB颜色模型也就是我们最常用的三原色,红绿蓝。RGB颜色模型在混色时属于加法混色,RGB中每种颜色数值越高,色彩越明亮。RBG为(0,0,0)时为黑色,RGB为(255,255,255)时为白…

各Rendering Path技术以及其在Unity中的实现

Rendering Path其实指的就是渲染场景中光照的方式。由于场景中的光源可能很多,甚至是动态的光源。所以怎么在速度和效果上达到一个最好的结果确实很困难。以当今的显卡发展为契机,人们才衍生出了这么多的Rendering Path来处理各种光照。 一. 正向渲染Fo…

射线碰撞

Physics.Raycast 光线投射 1.一个静态的发射射线的方法,在场景中投下可与所有碰撞器碰撞的一条光线。 参数解释: origin:射线起始点 direction:射线方向 distance:射线长度 layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。…

GPU Gems2 - 3 几何体实例化的内幕(Inside Geometry Instancing)

文章部分内容摘自 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章讨论了在Direct3D中渲染一个几何体的许多独特实例(Instance)的技术细节问题,对几何体实例(Geometry Instancing)的技术内幕进行了分析。 【…

Unity所有移动方法总结

简介 在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和…

GPU Gems2 - 4 分段缓冲(Segment Buffering)

文章参照该文 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章介绍了一项可以明显减少一个显示帧中渲染的批次数目的技术——分段缓冲(segment buffering),以及其改进。 【核心要点】 分段缓冲(segment buffering&…

tcp 和 dcp 的几大区别

TCP,Transmission Control Protocol的缩写,即传输控制协议。 DCP,User Data Protocol 的缩写,即用户数据报协议。 顺便提一下ARP,即地址解析协议。 区别: 1、TCP协议是有连接的,开始传输数据之…

GPU Gems2 - 6 用多流来优化资源管理(Optimizing Resource Management with Multistreaming)

本文摘自https://zhuanlan.zhihu.com/p/38411575 【章节概览】 现代实时图形应用程序最困难的问题之一是必须处理庞大的数据。复杂的场景结合多通道的渲染,渲染起来往往会较为昂贵。 首先,多流(Multistreaming)技术由微软在Dire…