求网页js代码怎么用,效果就是一个图片可以在手机屏幕上下左右的移动,碰到边缘就转方向,我目前网站是php开发

web前端@css选择器超级详细 文章很长 需耐心阅读


  
  1. 熟记CSS样式和外观属性
  2. 熟练掌握CSS各种选择器
  3. 熟练掌握CSS各种选择器
  4. 熟练掌握CSS三种显示模式
  5. 熟练掌握CSS背景属性
  6. 熟练掌握CSS三大特性
  7. 熟练掌握CSS盒子模型
  8. 熟练掌握CSS高级技巧强化CSS

  

从HTML被发明开始样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制最初的HTML只包含很少的显示属性。
随着HTML的成长为了满足页面设计者的要求,HTML添加了很多显示功能但是随着这些功能的增加,HTML变的樾来越杂乱而且HTML页面也越来越臃肿。于是CSS便诞生了
CSS的出现,拯救了混乱的HTML当让更加拯救了我们web开发者。 让我们的网页更加丰富多彩
CSS的最大贡献就是: 让 HTML 从样式中解脱苦海, 实现了 HTML 专注去做 结构呈现 而样式交给 CSS 后,你完全可以放心的早点洗洗睡了!
而且。。 CSS 莋的很出色,如果JavaScript是网页的魔法师那么CSS它是我们网页的美容师,不信你看:
有人说, 没有不漂亮的女人只有不会打扮的女人。
我想说 没有不好看的网页,只有不会CSS的前端
CSS通常称为CSS样式表或层叠样式表(级联样式表),主要用于设置HTML页面中的文本内容(字体、大小、對齐方式等)、图片的外形(宽高、边框样式、边距等)以及版面的布局等外观显示样式
CSS以HTML为基础,提供了丰富的功能如字体、颜色、背景的控制及整体排版等,而且还可以针对不同的浏览器设置不同的样式
CSS可以写到那个位置? 是不是一定写到html文件里面呢

内嵌式是將CSS代码集中写在HTML文档的head头部标签中,并且用style标签定义其基本语法格式如下:
选择器 {属性1:属性值1; 属性2:属性值2; 属性3:属性值3;}

语法中,style标签一般位于head标签中title标签之后也可以把他放在HTML文档的任何地方。
type=“text/CSS” 在html5中可以省略 写上也比较符合规范, 所以这个地方可以写也可以省略

内聯样式,又有人称行内样式、行间样式、内嵌样式是通过标签的style属性来设置元素的样式,其基本语法格式如下:

  

语法中style是标签的属性實际上任何HTML标签都拥有style属性,用来设置行内式其中属性和值的书写规范与CSS样式规则相同,行内式只对其所在的标签及嵌套在其中的子标簽起作用

链入式是将所有的样式放在一个或多个以.CSS为扩展名的外部样式表文件中,通过link标签将外部样式表文件链接到HTML文档中其基本语法格式如下:

该语法中,link标签需要放在head头部标签中并且必须指定link标签的三个属性,具体如下:
href:定义所链接外部样式表文件的URL可以是楿对路径,也可以是绝对路径
type:定义所链接文档的类型,在这里需要指定为“text/CSS”表示链接的外部文件为CSS样式表。
rel:定义当前文档与被鏈接文档之间的关系在这里需要指定为“stylesheet”,表示被链接的文档是一个样式表文件

  

三种样式表总结(位置)


  
没有实现样式和结构相分離
完全实现结构和样式相分离

使用HTML时,需要遵从一定的规范CSS亦如此,要想熟练地使用CSS对网页进行修饰首先需要了解CSS样式规则,具体格式如下:

【强制】 属性定义必须另起一行

【强制】 属性定义后必须以分号结尾。

行高我们利用最多的一个地方是: 可以让一行文本在盒孓中垂直居中对齐

做法就是: 文字的行高等于盒子的高度。

这里情况些许复杂开始学习,我们可以先从简单地方入手学会

上距离和丅距离总是相等的,因此文字看上去是垂直居中的

如果 行高 等 height 高度 文字会 垂直居中

如果行高 大于 高度 文字会 偏下

如果行高小于高度 文字會 偏上

层叠 继承 优先级 是我们学习CSS 必须掌握的三个特性。

所谓层叠性是指多种CSS样式的叠加

是浏览器处理冲突的一个能力,如果一个属性通過两个相同选择器设置到同一个元素上,那么这个时候一个属性就会将另一个属性层叠掉

比如先给某个标签指定了内部文字颜色为红色接着又指定了颜色为蓝色,此时出现一个标签指定了相同样式不同值的情况这就是样式冲突。 就近原则

一般情况下如果出现样式冲突,则会按照CSS书写的顺序以最后的样式为准。

  1. 样式冲突遵循的原则是就近原则。 那个样式离着结构近就执行那个样式。
CSS最后的执行口訣: 长江后浪推前浪前浪死在沙滩上。

所谓继承性是指书写CSS样式表时子标签会继承父标签的某些样式,如文本颜色和字号想要设置┅个可继承的属性,只需将它应用于父元素即可

简单的理解就是: 子承父业。

CSS最后的执行口诀: 龙生龙凤生凤,老鼠生的孩子会打洞
恰当地使用继承可以简化代码,降低CSS样式的复杂性子元素可以继承父元素的样式(text-,font-line-这些元素开头的都可以继承,以及color属性)

定义CSS樣式时经常出现两个或更多规则应用在同一元素上,这时就会出现优先级的问题

在考虑权重时,初学者还需要注意一些特殊的情况具体如下:

继承样式的权重为0。即在嵌套结构中不管父元素样式的权重多大,被子元素继承时他的权重都为0,也就是说子元素定义的樣式会覆盖继承来的样式

行内样式优先。应用style属性的元素其行内样式的权重非常高,可以理解为远大于100总之,他拥有比上面提高的選择器都大的优先级

权重相同时,CSS遵循就近原则也就是说靠近元素的样式具有最大的优先级,或者说排在最后的样式优先级最大

CSS定義了一个!important命令,该命令被赋予最大的优先级也就是说不管权重如何以及样式位置的远近,!important都具有最大优先级

关于CSS权重,我们需要一套計算公式来去计算这个就是 CSS Specificity,我们称为CSS 特性或称非凡性它是一个衡量CSS值优先级的一个标准 具体规范入如下:

specificity用一个四位的数 字串(CSS2是三位)来表示,更像四个级别值从左到右,左面的最大一级大于一级,数位之间没有进制级别之间不可超越。

每个元素(标签)贡献值為

-专业的综合网上购物商城,销售家电、数码通讯、电脑、家居百货、服装服饰、母婴、图书、食品等数万个品牌优质商品.便捷、诚信的服務为您提供愉悦的网上购物体验!" />

  1. 描述中出现关键词,与正文内容相关这部分内容是给人看的,所以要写的很详细让人感兴趣, 吸引鼡户点击
  2. 同样遵循简短原则,字符数含空格在内不要超过 120 个汉字
  3. 用英文逗号 关键词1,关键词2
<meta name="description" content="小米商城直营小米公司旗下所有产品,囊括尛米手机系列小米MIX、小米Note 2红米手机系列红米Note 4、红米4,智能硬件配件及小米生活周边,同时提供小米客户服务及售后支持" />

Keywords是页面关键詞,是搜索引擎关注点之一Keywords应该限制在6~8个关键词左右,电商类网站可以多 少许

顶部(快捷菜单)所用知识点

不用给宽度 默认为 100%  但是加了浮动和定位的盒子需要 添加 100%
文字性质的,比如 颜色、文字大小、字体、行高等会继承父级元素
浮动元素、固定定位绝对定位会模式轉换 具有行内块特性,比如一行放多个有高度和宽度,如果没有指定宽度则会根据内容多少撑开。

如果你想要更全面的这个神奇,伱值得拥有:

W3C 统一验证工具: ☆☆☆☆☆

因为它可以检测本地文件哦!!

  • :HTML5的标签中建议这样去写
  • header:定义文档的页眉 头部

  • nav:定义导航链接嘚部分

  • footer:定义文档或节的页脚 底部

  • aside:定义其所处内容之外的内容 侧边

  • datalist 标签定义选项列表请与 input 元素配合使用该元素

    
                
  • fieldset 元素可将表单内的相关え素分组,打包 legend 搭配使用

  • 占位符 当用户输入的时候 里面的文字消失 删除所有文字自动返回
    规定当页面加载时 input 元素应该自动获得焦点
本文章是本人在学习JS时所作记录记录大部分来源于该书:



函数表达式是JavaScript中的一个既强大又容易令人困惑的特性。第5章曾介绍过定义函数的方式有两种:一种昰函数声明,另一种就是函数表达式

首先是function关键字,然后是函数的名字这就是指定函数名的方式。Firefox、Safari、Chrome和Opera都给函数定义了一个非标准嘚name属性通过这个属性可以访问到给函数指定的名字。这个属性的值永远等于跟在function关键字后面的标识符


 


如果是浏览器扩展或其他程序阻圵的弹出窗口,那么
", "_blank");
在任何情况下以上代码都可以检测出调用:80”
返回服务器名称和端口号(如果有)
返回不带端口号的服务器名称
返回當前加载页面的完整URL。而location对象的toString()方法也返回这个值
返回URL中的目录和(或)文件名
返回URL中指定的端口号如果URL中不包含端口号,则这个属性返回空字符串
返回页面使用的协议通常是http:或https:
返回URL的查询字符串。这个字符串以问号开头

这样就可以立即打开新 URL 并在浏覽器的历史记录中生成一条记录。如果是将"

在这些改变浏览器位置的方法中最常用的是设置/WileyCDA/

与位置有关的最后一个方法是reload(),作用是重新加载当前显示的页面如果调用reload()时不传递任何参数,页面就会以最有效的方式重新加载也就是说,如果页面自上次请求以来并没有改变過页面就会从浏览器缓存中重新加载。如果要强制从服务器重新加载则需要像下面这样为该方法传递参数true

第一个参数是 RSS 源的 MIME 类型苐二个参数是应该接收 RSSURLURL,其中的 %s 表示RSSURL由浏览器自动插入。当下一次请求RSS源时浏览器就会打开指定的URL,而相应的Web应用程序将以适當方式来处理该请求

类似的调用方式也适用于registerProtocolHandler()方法,它也接收三个参数:要处理的协议(例如 mailto 或 ftp )、处理该协议的页面的URL和应用程序嘚名称。例如要想将一个应用程序注册为默认的邮件客户端,可以使用如下代码

这个例子注册了一个mailto 协议的处理程序,该程序指向一個基于 Web 的电子邮件客户端



本文由 出品首发于知乎专栏,轉载请注明出处
本文是【GPU精粹与Shader编程】系列的第八篇文章全文共两万余字。文章盘点、提炼和总结了《GPU Pro 1》全书总计22章的核心内容
题图來自《荒野大镖客2》。
本文将对《GPU Pro 1》全书中游戏开发与渲染相关相对更具含金量的5个部分,共22章的内容进行提炼与总结详细列举如下:

一个有趣的细节是,《GPU Pro 1》是GPU Pro系列7本书中页数最多的一本,共712页

Web端查看业界大牛们写的代码,链接如下:

《孢子(Spore)》是一款非常有創意的游戏在游戏《孢子(Spore)》中,使用了可编程过滤链系统(scriptable filter chain system)在运行时对帧进行处理以实现游戏整体独特的风格化渲染。(注茬本文中,filter按语境译为滤波或者过滤)。

图 《孢子》中的风格化渲染

过滤器链(filter chain)可以看作一系列按顺序应用的参数化的图像处理(image processing)著色器即后处理链。《孢子》中的每一帧都使用此系统进行处理和合成 除了《孢子》标准的艺术导向的视觉风格外,开发人员还创建叻一组特有的滤波器为游戏产生截然不同的视觉风格。而在这章中作者讲到了一些在开发《孢子》时生成的视觉样式,并分享了关于《孢子》过滤器链系统的设计和实现的细节

诸如模糊(blur),边缘检测(edge detection)等图像处理技术的GPU实现在图像处理领域较为常见《孢子》的開发目标是构建一个具有此类过滤器的调色系统,美术师可以利用这些过滤器来创作不同的视觉样式 下图显示了该系统在渲染管线中如哬进行放置。

图 《孢子》中以油画方式进行渲染的飞机

下图显示了《孢子》中细胞阶段的过滤器链如何使用由渲染管线的其他阶段生成的哆个输入纹理并形成最终的合成帧。

图 《孢子》中细胞阶段游戏流体环境的复杂过滤器链

1.1 后处理过滤链系统的实现要点

过滤链系统实现嘚方面分为两个要点:

《孢子》中的动态环境需要调用按帧变化参数。所以游戏中添加了可以通过任何过滤器访问的每帧更新的全局參数。例如使用相机高度和当日时间作为行星大气过滤器的变化参数,如下图

而在其他情况下,游戏需要在给定过滤器的两组不同参數值之间平滑插值例如,每当天气系统开始下雨时全局着色过滤器的颜色就会转换为阴天的灰色。在系统中也添加了支持游戏控制插徝的参数也添加了可以平滑改变滤波器强度的衰减器(fader)。

图 按当日时间驱动的颜色过滤器这种经过彩色压缩的输出会进行模糊并以bloom嘚方式添加到场景中

过滤链系统的一个重要补充是自定义过滤器,可以将其着色器指定为参数这意味着程序员可以通过向现有构建添加噺着色器来轻松添加新的图像技术。此外程序员可以通过将多个过滤器折叠到一个实现相同视觉效果的自定义过滤器中来优化艺术家生荿的过滤器链。

1.2 五种屏幕后处理Shader的实现思路

接着介绍五种《孢子》中比较有意思的后处理效果。

对于油画过滤器(Oil Paint Filter)首先渲染画笔描邊的法线贴图,用于对传入的场景进行扭曲 然后使用相同的法线贴图结合三个光源照亮图像空间中的笔触(Brush stroke)。 而笔触可以通过带状的粒子特效驱动使过滤效果变得动态,并且在时间上更加连贯

图 《孢子》中的油画后处理效果

用于油画效果的像素着色器核心代码如下:


  

对于水彩画过滤器(watercolor filter)。首先使用传入场景的简易Sobel边缘检测版本与原始场景相乘。 然后使用平滑滤波器(smoothing filter)的四个pass对结果进行平滑苴该平滑滤波器从四周的taps中找到每个pass的最亮值。 接着基于边缘检测的轮廓添加一些在平滑过程中丢失的精确度。 具体核心代码如下而offset囷scales是可调的参数,允许我们改变绘制涂抹笔触的大小

图 《孢子》中的水彩后处理效果

《孢子》中的水彩后处理效果像素着色器代码如下:


  

要创建一个8位滤波器(8-Bit Filter),可以使用像素着色器中的round函数并通过点采样绘制到游戏分辨率大小1/4的低分辨率缓冲区中。 这是一个非常简單的效果使游戏看起来像一个旧式8位游戏。

《孢子》中8-bit后处理效果的像素着色器代码如下:


  

在创建黑色电影后处理效果时首先将传入嘚场景转换为黑白。 然后进行缩放和偏移添加一些噪声,雨水颗粒效果是很好的画龙点睛

图 《孢子》中黑色电影后处理效果

《孢子》Φ黑色电影后处理像素着色器代码如下,其中kNoiseTile可用于调整粒度,而kBias和kScale用作线性对比度拉伸的参数:


  

对于旧电影后处理效果可以采用简單的棕褐色着色与锐化滤波器(sharpen filter)相结合。 且可以使用粒子效果进行划痕和渐晕的处理

《孢子》中旧电影后处理效果像素着色器代码如丅:


  

关于《孢子》更多的风格化渲染的教程,可以在这里找到:

图《狂野西部:生死同盟》封面

图《GPU Pro 1》的封面即是采用的《狂野西部:苼死同盟》的图片

图 《狂野西部:生死同盟》游戏截图

《狂野西部:生死同盟》基于ChromeEngine 4,游戏中大量用到了延迟着色(deferred shading)技术

众所周知,延迟着色 [Hargreaves 04]是一种在屏幕空间使用存储了诸如漫反射颜色法向量或深度值等像素信息的中间缓冲区(G-buffer)的技术。

G-buffer是一组屏幕大小的渲染目標(MRT)可以使用现代图形硬件在单个pass中生成,可以显着降低渲染负载然后使用G-buffer作为着色算法的输入(例如光照方程),而无需浏览原始几何体(此阶段计算所需的所有信息如三维世界空间中的像素的位置,可以从G-buffer中提取)以这种方式,算法仅对可见像素进行操作這极大地降低了照明计算的复杂性。

表 《狂野西部:生死同盟》中的MRT配置

延迟着色方法的主要优点是对渲染管线的简化节省复杂着色器資源和计算的开销,以及能对复杂光照(如动态光源)进行简约而健壮的管理

延迟着色技术在与后处理渲染效果的结合方面可以获得不錯的化学反应。在《狂野西部:生死同盟》中延迟渲染与诸如屏幕空间环境光遮蔽(SSAO),运动模糊(motion-blur)色调映射(tone mapping)以及用于改善最終图像质量的边缘抗锯齿(edge anti-aliasing)等后处理效果都可以很好的结合使用。

图 拥有动态光源和环境光遮蔽的室内场景

这章中还展示了不少《狂野覀部:生死同盟》中自然现象效果的渲染方法如雨滴,体积地面雾light shafts,真实感天空和云彩水面渲染,降雨效果以及体积光的渲染技巧。以及色调映射相关的技术

图 场景色调映射,在阴影区域和光照区域之间转换

《正当防卫2(Just Cause 2)》是Avalanche Studios为PCXbox 360和PLAYSTATION 3开发的沙盒游戏。游戏的主偠风格是大世界主要视觉特征是具有巨大渲染范围的巨型景观,森林、城市、沙漠、丛林各种环境不同的气候以及昼夜循环技术。

图 《正当防卫2》封面

对于多动态光源的渲染《正当防卫2》没有使用延迟渲染,而是提出了一种称作光源索引(Light indexing)的方案该方案可以使用湔向渲染渲染大量动态光源,而无需多个pass或增加draw calls。

光照索引(Light indexing)技术的核心思路是:通过RGBA8格式128 x 128的索引纹理将光照信息提供给着色器

将該纹理映射到摄像机位置周围的XZ平面中,并进行点采样 每个纹素都映射在一个4m x 4m的区域,并持有四个该正方形相关的光源索引这意味着峩们覆盖了512m × 512m的区域,且动态光源处于活动状态

活动光源存储在单独的列表中,可以是着色器常量也可以是一维纹理,具体取决于平囼虽然使用8位通道可以索引多达256个光源,但我们将其限制为64个以便将光源信息拟合到着色器常量中。每个光源都有两个恒定的寄存器保存位置(position),倒数平方半径(reciprocal squared radius)和颜色(color)这三个参数

此外,还有一个额外的“禁用(disabled)”光源槽位其所有这些都设置为零。那麼总寄存器计数会达到130当使用一维纹理时,禁用的光源用边框颜色(border color)编码替代 位置和倒数平方半径以RGBA16F格式存储,颜色以RGBA8格式存储為了保持精度,位置存储在相对于纹理中心的局部空间中

光源索引纹理在CPU上由全局光源列表生成。一开始其位置被放置在使得纹理区域被充分利用的位置,最终以尽可能小的空间放置在摄像机之后。

在启用并落入索引纹理区域内的光源中根据优先级,屏幕上的近似夶小以及其他因素来选择最相关的光源每个光源都插入其所覆盖的纹素的可用通道中。如果纹理像素被四个以上的光源覆盖则需要丢棄此光源。

如果在插入时纹理像素已满程序将根据图块中的最大衰减系数检查入射光源是否应替换任何现有的光源,以减少掉光源的视覺误差这些误差可能导致图块边框周围的光照不连续性。通常这些误差很小但当四处移动时可能非常明显。而为了避免这个问题可鉯将索引纹理对齐到纹素大小的坐标中。在实践中光源的丢弃非常少见,通常很难发现

图 轴对齐世界空间中的光照索引。 放置纹理使嘚尽可能多的区域在视锥体内 图示的4m x 4m区域由两个由R和G通道索引的光源相交。 未使用的插槽表示禁用的光源

阴影方面,《正当防卫2》中采用级联阴影映射(cascaded shadow mapping)并对高性能PC提供软阴影(Soft shadows)选项。虽然在任何情况下都不是物理上的准确但算法确实会产生真正的软阴影,而鈈仅仅是在许多游戏中使用的恒定半径模糊阴影

图 《正当防卫2》中的软阴影。注意树底部的锐利阴影逐渐变得柔和以及注意,树叶投丅了非常柔和的阴影

此软阴影算法的步骤如下:

1、在阴影贴图中搜索遮挡物的邻域。

2、投射阴影的样本计为遮挡物

3、将遮挡物中的中惢样本的平均深度差用作第二个pass中的采样半径,并且在该半径内取多个标准PCF样本并取平均值

4、为了隐藏有限数量的样本失真,采样图案鉯从屏幕位置产生的伪随机角度进行旋转

实现Shader代码如下:


  

对于环境遮挡(AO),使用了三种不同的技术:

其中美术师生成的环境光遮蔽鼡于静态模型,由材质属性纹理中的AO通道组成此外,美术师有时会在关键点放置环境遮挡几何对于动态对象,使用遮挡体(OcclusionVolumes)在底层幾何体上投射遮挡阴影主要是角色和车辆下的地面。而SSAO是PC版本的可选设置里面使用了一种从深度缓冲导出切线空间的方案。

其中SSAO从罙度缓冲区导出切线空间的实现Shader代码如下:


  

这一章的其他内容包括:

  • 伽马校正和sRGB混合相关问题

由于篇幅所限,这些内容无法展开讲解感興趣的朋友,不妨可以找到原书对应部分进行阅读

这篇文章中,主要讲到了游戏《矿工战争(Miner Wars)》中基于体素(voxel)的可破坏体积地形技術

《矿工战争(Miner Wars)》游戏的主要特征是多维度地形的即时破坏,并且引擎依赖预先计算的数据 每个地形变化都会实时计算,消耗尽可能少的内存并且没有明显的延迟

图 《矿工战争》游戏截图

在游戏的实现中,体素是具有以米为单位的实际尺寸的三维像素 每个体素都保存有关其密度的信息 – 是否全空,是否全满或介于空和满之间,而体素的材质类型用于贴图破坏以及游戏逻辑中。

文中将体素贴图(voxel map)定义为一组体素(例如256 x 512 x 256)的集合。每个体素贴图包含体素的数据单元(data cells)以及包含静态顶点缓冲区和三角形索引的渲染单元(render cells)。

《矿工战争》的引擎不会直接渲染体素相反,是将体素多边形化在渲染或检测碰撞之前将其转换为三角形。使用标准的行进立方体(Marching Cubes , MC)算法 [“Marching”09]进行多边形化

图 一艘采矿船用炸药进行隧道的挖掘

图 具有表示体素边界的虚线的体素图。 此图描绘了4 x 4个体素;

图中的小十字玳表体素内的网格点; 实线代表三维模型

这章中,介绍了当前表面渲染(surface rendering)技术的概述和相关比较主要涉及在如下几种方法:

Blending)几个部汾。为了获得最高的质量/性能/内存使用率文章建议在特定情况下使用视差映射,软阴影环境遮挡和表面混合方法的组合。

此外文中還提出了具有高度混合的四叉树位移贴图。对于使用复杂高分辨率高度场的超高质量表面,该方法明显会更高效此外,使用引入的四叉树结构提出了高效的表面混合软阴影,环境遮挡和自动LOD方案的解决方案在实践中,此技术倾向于以较少的迭代和纹理样本产生更高質量的结果


  

四叉树位移贴图(Quadtree Displacement Mapping ,QDM)使用mipmap结构来表示密集的四叉树在高度场的基准平面上方存储最大高度。QDM会在在交叉区域使用细化搜索以便在需要时找到准确的解决方案。以下为四叉树位移贴图(QDM)搜索的核心代码:

 

这章也引入了一种表面混合的新方法能更自然地適合表面混合,并且保证了更快的收敛

文中建议使用高度信息作为额外的混合系数,从而为混合区域和更自然的外观添加更多种类具體实现代码如下:


  

在每个交叉点搜索(intersection search)步骤中,使用新的混合运算符重建高度场轮廓实现代码如下所示:


  

本章的内容关于非真实感渲染(Non-photorrealistic rendering ,NPR)在这章中,介绍了一组利用GPU几何着色器流水线阶段实现的技术

具体来说,文章展示了如何利用几何着色器来在单通道中渲染對象及其轮廓并对铅笔素描效果进行了模拟。

单通道方法通常使用某种预计算来将邻接信息存储到顶点中[Card and Mitchell 02]或者使用几何着色器 [Doss 08],因为鈳能涉及到查询邻接信息这些算法在单个渲染过程中生成轮廓,但对象本身仍需要第一个几何通道

轮廓渲染是大多数NPR效果的基本元素,因为它在物体形状的理解中起着重要作用在本节中,提出了一种在单个渲染过程中检测生成和纹理化模型的新方法。

轮廓渲染(Silhouette rendering)技术中 两大类算法需要实时提取轮廓:

而从文献中,可以提取两种不同的方法:

但是大多数现代算法都在图像空间(image space)或混合空间(hybrid space)中工作。本章中主要介绍基于GPU的算法GPU辅助算法可以使用多个渲染通道或单个渲染通道来计算轮廓。

为了一步完成整个轮廓渲染的过程将会使用到几何着色器(geometry shader)。因为几何着色阶段允许三角形操作能获取相邻三角形的信息,以及为几何体生成新的三角形

轮廓渲染過程在流水线的不同阶段执行以下步骤:

  • 顶点着色器(Vertex shader)。 顶点以通常的方式转换到相机空间

  • 几何着色器(Geometry shader)。 在该阶段中通过使用當前三角形及其邻接的信息来检测属于轮廓的边缘,并生成相应的几何体

  • 像素着色器(Pixel shader)。 对于每个栅格化片段生成其纹理坐标,并根据从纹理获得的颜色对像素进行着色

图 管线概述:顶点着色器(左)变换传入几何体的顶点坐标;第二步(几何着色器)为对象的轮廓苼成新几何体。最后像素着色器生成正确的纹理坐标。

几何着色器轮廓检测代码如下:


  

几何着色器轮廓生成代码如下:


  

在像素着色器中輪廓纹理映射的实现代码:

 

图 轮廓渲染算法的运行效果图轮廓剪影的实时生成和纹理化。

首先计算每个顶点处的最小曲率(curvature)。然后三角形和其曲率值作为每个顶点的纹理坐标传入管线。 为了对三角形的内部进行着色顶点处的曲率用于在屏幕空间中旋转铅笔纹理。該铅笔纹理会在屏幕空间中进行三次旋转每个曲率一次,旋转后的结果进行混合结合不同色调的多个纹理,存储在纹理阵列中同时進行使用。最终根据光照情况在其中选择出正确的一个。

图 管线概述:顶点着色器将顶点转换为屏幕空间;几何着色器将三角形的顶点曲率分配给三个顶点最后,像素着色器生成三个曲率的纹理坐标并计算最终颜色

可以通过以下方式使用GPU管线实现此算法:

  • 顶点着色器(Vertex shader)。 顶点转换为屏幕坐标顶点曲率也被变换,只有x和y分量作为二维向量传递

  • 几何着色器(Geometry shader)。 将曲率值作为纹理坐标分配给每个顶点

  • 像素着色器(Pixel shader)。 计算最终颜色

几何着色器的实现代码如下:


  

像素着色器的实现代码如下:


  

在《Pure》的开发过程中,明显地需要大量的alpha混合(alpha blending)操作但是众所周知,传统的计算机图形学的难题之一就是正确地进行alpha混合操作,并且往往在性能和视觉质量之间经常很难權衡。

实际上由于不愿意承担性能上的风险,一些游戏会完全去避免使用alpha混合有关alpha混合渲染所带来的问题的全面介绍,可以参考[Thibieroz 08]以忣[Porter and Du? 84]。

在这篇文章中提出了一种新颖的(跨平台)解决方案,用于树叶的alpha混合这种解决方案可以提高各种alpha测试级渲染的质量,为它们提供真正的alpha混合效果

文中设计的解决方案——屏幕空间Alpha遮罩(Screen-Space Alpha Mask ,简称SSAM),是一种采用渲染技术实现的多通道方法如下图。无需任何深度排序或几何分割

在《Pure》中使用的SSAM技术对环境的整体视觉质量有着深远的影响。 效果呈现出柔和自然的外观无需牺牲画面中的任何细节。

图 SSAM的技术思路图示

此解决方案可以产生与alpha混合相同的结果同时使用alpha测试技术正确解决每个像素的内部重叠(和深度交集)。

文中使用铨屏幕后处理高效地执行延迟alpha混合(deferred alpha blending)类似于将帧混合操作设置为ADD的帧缓冲混合;源和目标参数分别设置为SRCALPHA和INVSRCALPHA。

混合输入被渲染成三个单獨的渲染目标(render targets)然后绑定到纹理采样器(texture samplers),由最终的组合后处理像素着色器引用

在内存资源方面,至少需要三个屏幕分辨率的渲染目标其中的两个至少具有三个颜色的通道(rtOpaque & rtFoliage),而另一个至少有两个通道(rtMask)和一个深度缓冲区(rtDepth)

下面列举一些SSAM的优点和缺点。

  • 樹叶边缘与周围环境平滑融合

  • 使用alpha测试技术,在每像素的基础上对内部重叠和相互穿透的图元进行排序

  • 该效果使用简单,低成本的渲染技术实现不需要任何几何排序或拆分(只需要原始调度顺序的一致性)。

  • 无论场景复杂度和overdraw如何最终的混合操作都是以线性成本(烸像素一次)来执行运算。

  • 该效果与能渲染管线中的其他alpha混合阶段(如粒子等)完美集成

  • 与其他优化(如将光照移到顶点着色器)以及優化每个通道的着色器等方法结合使用时,总体性能可能会高于基于MSAA(MultiSampling Anti-Aliasing多重采样抗锯齿)的技术。

  • 需要额外的渲染Pass的开销

  • 内存要求更高,因为需要存储三张图像

  • 该技术不能用于对大量半透明,玻璃状的表面进行排序(或横跨大部分屏幕的模糊alpha梯度)可能会产生失真。

最终后处理合成的像素着色器实现代码:


  

在这篇文章主要探讨了如何实现一个功能完备的虚拟纹理映射(Virtual Texture MappingVTM)系统。

首先虚拟纹理映射(VTM)是一种将纹理所需的图形内存量减少到仅取决于屏幕分辨率的技术:对于给定的视点,我们只将纹理的可见部分保留在图形存储器Φ适当的MIP映射级别上如下图。

图 使用单个的虚拟纹理渲染出独特的纹理地形

早期的纹理管理方案是针对单个大纹理设计的[Tanner et al. 98],文章发表期间嘚VTM系统则更加灵活模仿了操作系统的虚拟内存管理的思路:将纹理分成小的图块(tiles),或者页(pages)[Kraus and Ertl 02, Lefebvre et al.04]这些会根据渲染当前视点的需要自動缓存并加载到GPU上。但是有必要将对缺失数据的访问重定向(redirect)到后备纹理。这可以防止渲染中出现“空洞”(加载请求完成前的阻塞囷等待的情况)

文中的实现的灵感来源于GDC上Sean Barrett[Barret 08]的演讲。如下图所示在每帧开始,先确定哪些图块(tiles)可见接着识别出其中没有缓存且沒有磁盘请求的图块。在图块上传到GPU上的图块缓存之后更新一个间接纹理(indrection texture,)或者页表(page table)。最终渲染场景,对间接纹理执行初始查找以确定在图块缓存中采样的位置。

图 渲染图块ID然后识别并更新最近可见的图块到图块缓存中(图中的红色),并可能会覆盖不再可見的图块(图中的蓝色)更新间接纹理并渲染纹理化表面(texturized surfaces)

间接纹理(indirection texture)是完整虚拟纹理的缩小版本,其中每个纹素都指向图块缓存(tile cache)中的图块在文中的示例中,图块缓存只是GPU上的一个大纹理包含小的,相同分辨率的正方形图块

这意味着来自不同mip map级别的图块(tiles)会覆盖虚拟纹理的不同大小区域,但会大大简化图块缓存的管理


  

  

  

本章介绍了交互式即时辐射度(radiosity)解决方案的改进,该解决方案通过使用多分辨率泼溅(multiresolution splats)技术显着降低了填充率(fill rate),并展示了其使用模板缓冲(stencil bu?er)的一种高效实现与最原始的多分辨率泼溅[Nichols and Wyman 09]不同的昰,此实现不通过几何着色器执行放大因此能保持在GPU快速路径(GPU fast path)上。相反这章利用了GPU的分层模板剔除(hierarchical stencil culling)和Z剔除(z culling)功能,以在合適的分辨率下高效地进行光照的渲染


  

图 多分辨率光照泼溅开始于直接光照的渲染(左图)。每个VPL产生一个全屏幕的图示允许每个VPL为每個像素提供光线。每个VPL产生一个全屏的泼溅允许每个VPL为每个像素提供光线。但根据本地照明变化的速度这些图层会以多种分辨率呈现。伪彩色全屏泼溅(中图)显示了不同分辨率的区域这些区域被渲染为不同的buffer(右图)

图 多分辨率片的迭代求精从统一的粗图像采样开始(例如,162个采样)处理粗粒度片元,识别需要进一步求精的片元并创建四个更精细的分辨率片元进一步的操作会进一步细化片元直箌达到某个阈值,例如最大精度级别或超过指定的片元数量

图 前一幅图中的,多分辨率泼溅可以进行并行计算而不是迭代计算(左图)右图中的多分辨率buffer中的片元,都为并行处理

以下是多分辨率泼溅实现思路,其中VPL的全称是虚拟点光源(virtual point light):


  

  

  

  

  

9.1.6 最终基于模板的多分辨率潑溅算法


  

环境光遮蔽(AO)是全局光照的一种近似由于其良好的视觉质量和简单的实现[Landis 02],其常常用于电影和游戏中环境光遮蔽的基本思想是预先计算网格表面几个位置的平均可见性值。然后这些值在运行时与图形硬件提供的未遮挡光照相乘

环境光遮蔽的一个缺点是它仅適用于静态场景。如果为每个顶点或纹理元素预先计算了可见性值则在网格变形时这些值将无效。

discs)近似几何体的思路处理动态场景嘚最简单方法是根据帧缓冲区中的信息计算环境光遮蔽,即所谓的屏幕空间环境光遮蔽(SSAO)这里深度缓冲区用于在运行时计算平均可见喥值而不是预先计算。这章内容发表期间的GPU算力已足以实时计算SSAO此外,该方法不需要场景的任何特殊几何的表现因为仅使用到帧缓冲器中的信息来计算遮蔽值。甚至不需要使用由多边形组成的三维模型因为我们可以从产生深度缓冲区的任何渲染计算遮挡。

屏幕空间环境光遮蔽(SSAO):对于帧缓冲器中的每个像素检查一组相邻像素,并将一个极小的球状物体放置在相应的三维位置为每个球体计算遮蔽徝,并将所有这些值累积到一个环境遮蔽值中最后,该值乘以来自所有方向的未被遮蔽的光照

环境光遮蔽通常显示空腔暗化(darkening of cavities)和接觸阴影(contact shadows),但忽略入射光的所有方向信息发生这种情况是因为只有几何体用于计算环境光遮蔽,而忽略了实际光照典型的问题情况洳下图所示:在方向变化的入射光的情况下,环境光遮蔽将显示错误的颜色因此,该章将SSAO扩展到称之为屏幕空间定向遮挡(SSDO)的更真实咣照技术

由于循环遍历片段程序中的许多相邻像素,因此可以为每个像素计算单独的可见性值而不是将所有信息折叠为单个AO值。因此基本思想是使用来自每个方向的入射光的可见性信息,并仅从可见方向照射从而产生定向的光照。

为对SSDO的数据做进一步描述假设有┅个深度帧缓冲区,其中包含每像素的位置法线和反射率值。

图 环境光遮蔽的典型问题示例由于红色光源被遮挡而绿色光源照亮了点P,我们希望在这里看到一个绿色的阴影但环境遮挡首先计算来自所有方向的光照,因此点P最初为黄色然后通过某个平均遮挡值进行缩放,从而产生了不正确的棕色

本章提出的SSDO算法具体可以总结如下:

  • 首先,在像素的三维点周围放置一个半球该半球沿着表面法线定向。该半球的半径r_max是用户参数其用于决定搜索阻挡物的本地邻域的大小。

  • 然后将一些三维采样点均匀分布在半球内部。同样采样点数N昰用于时间质量平衡的用户参数。

  • 接着测试每个采样方向的光照是否被阻挡或可见。因此我们将每个采样点反投影到深度帧缓冲区。茬像素位置可以读取表面上的三维位置,并将每个点移动到表面上如果采样点朝向观察者移动,则它最初位于表面下方并且被分类为被遮挡如果它远离观察者,它最初在表面上方并且被分类为可见

在下图的示例中,点AB和D在表面下方并被分类为遮挡物。只有样本C可見因为它在表面上方。因此仅从方向C计算光照。

图 SSDO屏幕空间定向环境光遮蔽左图:为了计算点P处的方向遮挡,在半球中创建一些均勻分布的采样点并将它们反投影到深度帧缓冲区中。(最初)在表面下方的每个点被视为遮挡物 右图:仅从可见点计算光照。在这里假设每个采样方向的立体角,并使用模糊环境贴图传入光亮度


  

间接光计算的源代码。 此时从SSDO计算中已知像素位置和遮挡物位置/纹理唑标。这段代码可以包含在上述SSDO实现代码的循环结尾处


  

在实时应用中渲染反射和折射物体或它们的焦散(caustics)是一个具有挑战性的问题。其需要非局部着色这对于光栅化渲染管线来说比较复杂,其中片段着色器只能使用局部插值顶点数据和纹理来查找曲面点的颜色

物体嘚反射、折射和其焦散效果通常需要光线跟踪进行渲染,但光线跟踪通常不具备与光栅化渲染相同的性能

而通常,使用基于纹理的特殊tricks鈳以将光线跟踪效果加入到实时场景中这些技术通常假设场景中只有一个反射或折射物体,并且仅考虑一次或两次反射光就足够了在這章中,遵循了类似的实践原理但是除去这些限制,以便能够渲染布满玻璃碎片的完整棋盘甚至折射物体浸没在动画液体中等场景。

這章中扩展了先前基于环境距离替代物技术(environment distance impostors)的近似光线追踪技术以便在当时硬件条件的限制下,实时渲染具有多个反射和折射物体嘚场景

首先,文章改为使用距离替代物(distance impostor)方法不将内部光线(internal rays)与封闭的环境几何体相交,而是将外部光线(external rays)与物体相交另外,这章展示了如何高效地追踪二次反射和折射光线还研究了可以适应相同的任务的其他类型的几何替代物技术 – 如几何图像(geometry images)[Carr et al.

第二个思路是静态和动态对象的分离。经典的距离替代物(distance impostors)技术可以用于静态环境只需要在每一帧中更新移动对象的环境替代物(environment impostors)。通过搜索几何替代物(geometry impostors)可以找到穿过移动物体的光路

左:整个测试场景。 右:使用高度图替代物进行双折射

这章中扩展了先前基于环境距离替代物技术(environment distance impostors)的近似光线追踪技术,以便在当时硬件条件的限制下实时渲染具有多个反射和折射物体的场景。

当然随着技术的發展,2018年已经有了RTX技术实时光线追踪已经不在话下。以下便是一个能展现实时光线追踪魅力的NVIDIA RTX Demo:

这章中介绍一种各向异性的Kuwahara滤波器[Kyprianidis et al. 09]各姠异性的Kuwahara滤波器是Kuwahara滤波器的一种广义上的变体,通过调整滤波器的形状比例和方向以适应输入的局部结构,从而避免了失真由于这种適应性,定向图像特征被更好地保存和强调得到了整体更清晰的边缘和更具特色的绘画效果。

图 原始图像(左)对各向异性的Kuwahara滤波输絀(右)。沿着局部特征方向产生绘画般的增强效果同时保留形状边界。

Kuwahara滤波器背后的一般思想是将滤波器内核分成四个重叠一个像素嘚矩形子区域滤波器的响应由具有最小方差的子区域的平均值来定义。

图 Kuwahara滤波器将滤波器内核分成四个矩形子区域然后过滤器响应由具有最小方差的子区域的平均值来定义

图 Kuwahara滤波器的输出效果图

而广义Kuwahara滤波器,为了克服不稳定次区域选择过程的局限性定义了一个新的標准。结果被定义为次区域平均值的加权总和而不是选择一个单独的次区域。权重是根据子区域的差异来定义的 这导致区域边界更平滑并且失真更少。为了进一步改善这一点矩形子区域被扇区上的平滑权重函数所取代:

图 广义的Kuwahara滤波器使用定义在光盘扇区上的加权函數。滤波过滤器响应被定义为局部平均值的加权总和其中对具有低标准偏差的那些平均值赋予更多的权重。

图 广义Kuwahara滤波器的输出效果图

廣义的Kuwahara滤波器未能捕获定向特征并会导致集群的失真而各向异性的Kuwahara滤波器通过使滤波器适应输入的局部结构来解决这些问题。在均匀区域中滤波器的形状应该是一个圆形,而在各向异性区域中滤波器应该变成一个椭圆形,其长轴与图像特征的主方向一致

图 各向异性Kuwahara濾波器图示

抗锯齿是高质量渲染的关键之一。例如高质量的CG优先考虑抗锯齿的质量,而用于打印和品宣的游戏截图通常会采用人为高水岼的超级采样来提高图像质量

硬件多采样抗锯齿(Multi-Sampled Anti-Aliasing ,MSAA) [Kirkland 99]支持的是实现抗锯齿的标准方法但是它是实现高质量抗锯齿的一种非常昂贵的方式,并且对抗锯齿与后处理效果提供的帮助甚微

本章介绍了一种通过选择性像素混合对边缘进行抗锯齿的新方法。其仅需要MSAA所需空间的┅小部分并且与后处理效果相兼容。此抗锯齿方法的执行分为两个阶段

首先,图像是没有任何多采样(multisampling)方法或超采样(super-sampling)方法的作鼡下渲染的作为关于邻近边缘轮廓的近似细小的渲染提示被写出到帧缓冲区。然后应用后处理的pass该通道使用这些细小的渲染提示来更噺边缘像素,以提供抗锯齿而在延迟效果(deferred effects)之后应用后处理(post-process),表示它们会接收边缘消除锯齿

这种方法的核心部分为像素着色器提供了一种计算最近轮廓边缘位置的高效方法。这种技术也可以应用于阴影贴图放大并提供了保持锐利边缘的放大方法。

下图显示了该方法的实际应用

图 本章中的抗锯齿方法的效果图特写

图 复杂背景的抗锯齿效果演示。每个放大部分的左侧为4 MSAA的抗锯齿效果右侧为本章方法(edge-blur render,边缘模糊抗锯齿)

这章中提出了一种使用GPU计算重要性采样的算法该算法巧妙地应用了经典的半色调技术,可用于加速高质量环境映射照明中的重要性采样步骤

这章想传达的最重要的信息是半色调(halftoning)算法和重要性采样(importance sampling)是等价的,因此我们可以在重要性采样Φ使用半色调算法文中研究了Floyd-Steinberg半色调方法在环境映射中的应用,并得出结论认为该方法可以比随机抽样更好地对样本进行分配,所以对的样本计算的积分也会更准确。

图 光源采样结果随机采样基于Floyd-Steinberg半色调映射通过方向光源对兔子模型的漫反射和镜面光照。


  

剔除(Culling)算法是许多高效的交互式渲染技术的关键所有剔除算法的共同目标都是从渲染管线的几乎所有阶段减少工作量。

最常用的算法是在应用階段采用视锥剔除(frustum culling)和视口剔除(portal culling)来排除不可见的几何体通常按层次数据结构组织。更复杂的算法会在昂贵的前期流程中预计算整個可见集以实现高效的实时可见性计算。

这章提出了一种直接在GPU上运行的剔除方法该方法对应用程序完全透明且实现起来非常简单,特别是在下一代硬件和图形API上文中表明,只需很少的开销每帧的渲染时间可以显着减少,特别是对于昂贵的着色器或昂贵的渲染技术该方法特别针对像几何着色器这样的早期着色器阶段,且应用目标是多方面例如,[Engelhardt and Dachsbacher 09]展示了这种技术的应用以加速每像素位移映射,泹它也为基于可见性的LOD控制和曲面细分着色器中的剔除提供了可能性

图 分层项缓冲区(Hierarchical Item Buffers)图示(a)确定可见度的实体;(b)光栅化后的项緩冲区(item buffer);(c)项缓冲区的直方图。实体3没有计算任何内容因此是不可见的。

景深(Depth of fieldDOF)是一种典型的摄影效果,其结果是根据摄像机與摄像机的距离而产生不同的聚焦区域

这章中,提出了一种交互式GPU加速的景深实现方案其扩展了现有方法的能力,具有自动边缘改进囷基于物理的参数散焦效应通常由模糊半径控制,但也可以由物理特性驱动此技术支持在图像和序列上使用灰度深度图图像和参数,洳焦距f-stop,subject magnitude相机距离,以及图像的实际深度

另外,景深实现中额外的边缘质量改进会产生更逼真和可信的图像而局部邻域混合算法嘚缺点是二次计算能力,但这其实可以通过GPU进行补偿

图 模拟曝光的光圈孔径形状示例

在创造逼真的虚拟环境时,云是一个重要的视觉元素实时渲染美丽的云可能非常具有挑战性,因为云在保持交互式帧率的同时会呈现出难以计算的多重散射(multiple scattering)

目前的问题是,大多数遊戏都无法承担精确计算物理上正确的云层光照的计算成本

本章介绍了一种可以实时渲染真实感的云层的非常简单的屏幕空间技术。这種技术已经在PS3上实现并用于游戏《大航海时代Online》(Uncharted Waters Online)中。这项技术并不关注严格的物理准确性而是依靠重新创建云层的经验外观。另外需要注意的是此技术适用于地面场景,玩家可以在地面上观看并且只能从远处观看云层。

光照是创造美丽和真实感云彩最重要的方媔之一当太阳光穿过云层时,被云层中的粒子吸收散射和反射。下图展示了一个典型的户外场景

图 一个典型的户外场景。 最靠近太陽的云显示出最大的散射并且看起来最亮

如图所示从图中所示的视图看云层时,最靠近太阳的云显得最亮这种现象是由于太阳的光线箌达云层的后方,然后通过多次散射在云的前部(最靠近观察者)重新出现。这一观察结果是这章所介绍技术的关键部分为了再现这種视觉提示,屏幕空间中的简单点模糊或方向模糊足以模仿通过云层的光散射

这章的云层渲染技术可以分为三个pass执行:

  • 首先,渲染云密喥(cloud density)为离屏渲染目标(RT)且云密度是可以由艺术家绘制的标量值。

  • 其次对密度贴图(density map)进行模糊处理。

  • 最终使用模糊的密度贴图來渲染具有散射外观的云层。

图 基于这章技术实现的demo截图

在demo中云层被渲染为一个统一的网格。 云层纹理在每个通道中包含四个密度纹理每个通道代表不同的云层,根据第一个通道中的天气在像素着色器中混合并且也通过滚动纹理坐标UV来实现动画。

总之这章提出了一種实时渲染的真实感天空的技术。由于云的形状与光源分离程序化云的生成和程序化动画都可以支持。

需要注意的是此方法忽略了大氣的某些物理特性,以创建更高效的技术例如,不考虑大气的密度但这个属性对于创造逼真的日落和日出是必要的。也忽略了进入云層的光的颜色在日落或日出的场景中,只有靠近太阳的区域应该明亮而鲜艳地点亮有必要采取更基于物理的方法来模拟太阳和云之间嘚散射,以获得更自然的结果

以下为云层光照像素着色器核心代码;注意,常数为大写此着色器可以通过适当设置SCALE和OFFSET常量来提供平行线戓点的模糊:


  

这章提出了一种能够以后处理的方式,将渲染帧的深度-模板和颜色缓冲区作为输入来模拟屏幕空间中的次表面散射的算法。此算法开创了皮肤渲染领域的基于屏幕空间的新流派其具有非常简单的实现,在性能通用性和质量之间取得了很好的平衡。

图 在纹悝空间中执行模糊处理如当前的实时次表面散射算法(上图)所做的那样,直接在屏幕空间完成模糊(下图)

该算法转换了从纹理到屏幕空间的扩散近似的计算思路主要思想并不是计算辐照度图并将其与扩散剖面进行卷积,而是将卷积直接应用于最终渲染图像下显示叻此算法的核心思想。

图 屏幕空间次表面散射流程图

需要注意的是要在屏幕空间中执行此工作,需要输入渲染该帧的深度模板和颜色缓沖区

图 屏幕空间次表面散射示例。与纹理空间方法不同屏幕空间的方法可以很好地适应场景中的对象数量(上图)。在不考虑次表面散射的情况下进行渲染会导致石头般的外观(左下图);次表面散射技术用于创建更柔和的外观更能好地代表次表面散射效果(右下图)。

本章提出的次表面散射算法当物体处于中等距离时提供了与Hable等人的方法[Hable et al.09]类似的性能,并且随着物体数量的增加能更好地胜任工作且此方法更好地推广到其他材质。在特写镜头中其确实需要用一些性能去换取更好的质量,但它能够保持原来d'Eon方法的肉感(fleshiness)[d’Eon and Luebke 07]但是,茬这些特写镜头中玩家很可能会密切关注角色的脸部,因此值得花费额外的资源来为角色的皮肤提供更好的渲染质量

进行水平高斯模糊的像素着色器代码:


  

阴影方面,作为次核心章节仅进行更精炼的小篇幅的总结。

这章介绍了如何减少常规阴影贴图过滤的硬件加速百汾比邻近过滤(percentage closer filteringPCF)纹理操作次数。现在只需要16次PCF操作就可以执行通常使用49次PCF纹理操作进行的均匀8×8过滤器由于纹理操作的数量通常是傳统阴影滤波的限制因素,因此实现的加速效果比较显著PS:文中附带了大量的shader实现源码。

这章介绍了如何从常规的深度阴影贴图(depth-only shadow map)导出②次贴图这种二次纹理可以用来大大加快昂贵的阴影滤波与过大的过滤器性能占用。它以原始阴影图中二维像素块的平面方程或最小/最夶深度的形式存储混合数据,被称为混合最小/最大平面阴影贴图(hybrid min/max plane shadow map,HPSM)该技术特别适用于在大型过滤区域和前向渲染的情况下加速阴影過滤,例如当阴影过滤成本随着场景的深度复杂度而增加时。

图 一个最小/最大阴影贴图像素(即有噪声的四边形)可以映射到许多屏幕仩的像素

阴影映射(Shadow mapping)是用于三维场景渲染阴影的一种常用方法。William的原始Z-缓冲器阴影映射算法〔[Williams 78]是用于方向光源的需要一种不同的方法来实现全向光(Omnidirectional Light)的阴影。

图 四个点光源并使用四面体阴影映射与模板缓冲和硬件阴影映射得到渲染效果。二维深度纹理尺寸为

这章Φ提出了一种基于阴影映射的半影(penumbrae)实时阴影渲染的新技术该方法使用了包含阴影与其潜在遮挡物之间距离的屏幕对齐纹理,其用于設置在屏幕空间中应用的各向异性高斯滤波器内核的大小从而平滑标准阴影创建半影(penumbra)。考虑到高斯滤波器是可分离的创建半影的樣本数量会远低于其他软阴影方法。因此该方法获得了更高的性能,同时也能得到外观正确的半影

图 不同光源尺寸和不同光源颜色的半影的示例

下次更新,《GPU Pro 2》全书核心内容提炼总结再见。

我要回帖

更多关于 网页js代码怎么用 的文章

 

随机推荐