花了$60买了正版的GPU Pro2。坚持每天学一点。

边学习边翻译,希望也能对别人有些益处。从Volume Decals 开始,可以从Emil Persson 的官网上下到源代码 http://www.humus.name/index.php?page=3D&ID=83

Volume Decals

Emil Persson

5.1 介绍

贴花通常应用于放置在场景几何体面上的贴图。在大部分情况下,这个应用都表现的很好。用贴图四边形来做贴花会造成Z-fighting的问题。在下面的几何体可能不平坦,造成贴花就绘制在了几向体的下面。在边缘处,贴花也有可能出现悬挂的情况。解决这个问题通常的办法是对贴花引入裁剪或者在这种情况下就不做贴花。将贴花合适的贴在任意的模型上需要很复杂的代码,必须要取得模型的顶点。在PC上意味着如果要取得很好的性能,就必须把模型几何体信息拷贝一份到内存中。有一个典型的例子,向一块石头射击,贴花可能没有跟对齐中心。这篇文章用体积贴花投影到场景几何体上的方法解决了所有的问题,这里面用到了深度缓存。

5.2 体积贴花

5.2.1 找到场景坐标

这个技术的想法是在选中的区域把贴花当成一个体积来渲染。任何一种凸的几何体都可以,但一般都用球或者盒子。通过采样深度缓存,fragment shader 计算在下面的几何体的位置。可以通过下面的方法实现:

// texCoord is the pixel's normalized screen position
float depth = DepthTex.Sample(Filter, texCoord);
float4 scrPos = float4(texCoord, depth, 1.0);
float4 wPos = mul(scrPos, ScreenToWorld);

图 5.1 贴花实例

float3 pos = wPos.xyz /wPos.w;
// pos now contains pixel position in world space

ScreenToWorld 矩阵是一个复合矩阵,包含了两个转换:从屏幕坐标系到裁剪坐标系,从裁剪坐标系到世界坐标系。从世界坐标到裁剪坐标是由ViewProjection矩阵完成的,所以这里要用这个矩阵的逆。裁剪空间范围x和y是从-1到1,然而贴图坐标是从0到1,所以我们需要一个对齐的操作。由以下的代码完成:

float4 ScaleToWorld = Scale(2, -2, 1) * Tranlate(-1, 1, 0) * Inverse(ViewProj);

我们感兴趣的是体积贴花和这个局部位置的关系。这个局部位置会被当成贴图坐标去采样一个体积贴花。因为这个贴花是个体积贴图,它会非常好的包裹着非连续性的特殊的图形(图5.2)。为了给每一个贴花唯一表现,可以给这个矩阵加一个随机的旋转。可以通过下面来构造:

float4 ScreenToLocal = Scale(2, -2, 1) * Translate(-1, 1, 0) * Inverse(ViewProj) * DecalTranslation * DecalScale * DecalRotation;

全部的fragment shader如下:

Texture2D<float> DepthTex;
SamplerState DepthFilter;Texture3D<float4> DecalTex;
SamplerState DecalFilter;cbuffer Constants
{float4x4 ScreenToLocal;float2 PixelSize;
};float4 main(PsIn in) : SV_Target
{// Compute normalized screen positionfloat2 texCoord = In.Position.xy * PixelSize;// Comput local position of scene geometryfloat depth = DepthTex.Sample(DepthFilter, texCoord);float4 scrPos = float4(texCoord, depth, 1.0f);float4 wPos = mul(scrPos, ScreenToLocal);// Sample decalfloat3 coord = wPos.xyz / wPos.w;return DecalTex.Sample(DecalFilter, coord);
}

5.2.2 开发和问题

这个系统可以在延迟渲染技术中实现的相当完美。贴花可以在geometry buffer (G-buffer) pass之后渲染,而且还可以将一些diffuse color,specularity color应用上去。这个技术同样适用于预渲染,意味着在贴花中还可以应用光照信息。

在前向渲染系统中,贴花必须在光照计算之后。举例说一些情况,爆炸后的烧焦的样子呀,贴花可以很好的与目标缓存进行试算。更复杂的一些情况是,用alpha 进行混合,常用于子弹打出一个洞,这种情况下,必须考虑到光照。其中一个解决方案是,当渲染时,在shader中的alpha通道中保存所有光照的亮度;在贴花时能将每个颜色通道预乘以alpha,在混合器中与目标透明度相乘以得到较好的效果。这并没有将灯光的颜色考虑在内,但如果灯光是清楚的白色,结果还是很好的。另一个解决办法是利用最近一个灯光的衰减数,不考虑法线。相应的,法线可以从深度缓存中得到,尽管这会很慢。

这种贴花技术有一个问题是,会在体积贴花内的所有的物体上应用上贴花。对于静态物体这没有问题,但如果你有一个巨大的贴花,然后有一些动态的物体在其内移动,这些动态的物体会得到贴花污点在其上面,举个例子,比如之前有一个炸弹在道路上弹了,之后有一个汽车从上面开过。这个问题可以通过在贴花之后渲染动态物体来解决。一个更好的解决办法是按出现的先后顺序去渲染,这样之后移动到贴花上的物体就不会受到贴花的影响。还有一个解决办法,是使用物体的ID号,贴花可以记录会应用贴图的物体。

5.2.3 优化

在一些平台上支持depth-bounds测试,depth-bounds测试会用于提高性能 。在其它一些平台上,动态分支会用于仿真这一功能,通过对比采样的深度缓存和depth-bounds。无论如何,这样Shader会短一些,很大一部分fragment 可以避免做深度测试。在一些情况下,如果不裁剪任何东西会更快一些。

GPU Pro 2 ------ Volume Decals相关推荐

  1. [gpu pro]《正当防卫2》渲染技术

    humus写在gpu pro上面的,其中很多东西在他的网站上,以及后来的siggraph12上面提及了,文章链接 雷同的地方就不记录了,结合siggraph12上面的那个文章,可以说含金量颇高,有较多 ...

  2. 《Gpu Gems》《Gpu Pro》《Gpu Zen》资源收集

    <Gpu Gems><Gpu Pro><Gpu Zen>系列读书笔记 [GPU精粹与Shader编程](一) 开篇 & 全系列11本书核心知识点总览

  3. 【GPU精粹与Shader编程】(一) 全系列核心知识点总览

    系列文章前言 <GPU Gems>1~3 .<GPU Pro>1~7 以及<GEM Zen>组成的GPU精粹系列书籍,是游戏开发.计算机图形学和渲染领域的业界大牛们 ...

  4. 【GPU精粹与Shader编程】(一) 开篇 全系列11本书核心知识点总览

    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处   文章链接: https://zhuanlan.zhihu.com/p/34917895 系列文章前言 <GPU Gems>1 ...

  5. 如何在ubuntu上安装nvidia-docker同时与宿主共享GPU cuda加速

    2019独角兽企业重金招聘Python工程师标准>>> 1.去github网站下载nvdia-docker 下载和安装nvdia-docker的命令是 # If you have n ...

  6. GPU处理图像 Shader的入门

    from:http://www.jianshu.com/p/8687a040eb48 字数2901 阅读316 评论0 喜欢3 Shader着色器 Shader出现在OpenGL ES 2.0中,允许 ...

  7. GPU 加速下的图像处理

    Instagram,Snapchat,Photoshop. 所有这些应用都是用来做图像处理的.图像处理可以简单到把一张照片转换为灰度图,也可以复杂到是分析一个视频,并在人群中找到某个特定的人.尽管这些 ...

  8. GPU Pro2 - 1.Terrain and Ocean Rendering with Hardware Tessellation

    最近时间多了起来,准备捡起扔下了的渲染部分的知识.想拜读下GPU Pro系列并且做个笔记,不知道自己能否坚持下来,但愿可以吧.自己能力也有限,写的东西也只是自己的理解,肯定有很多理解不到位甚至错误的地 ...

  9. ubuntu16.04 安装cuda9.0+cudnn7.0.5+tensorflow+nvidia-docker配置GPU服务

    [摘要] docker很好用,但是在GPU服务器上使用docker却比较复杂,需要一些技巧,下面将介绍一下在ubuntu16.04环境下的GPU-docker环境搭建过程. 第一步: 删除之前的nvi ...

最新文章

  1. ecplise 设置代码自动提示功能的设置
  2. python3 数据库操作 orm sqlalchemy 简介
  3. MP3Player(附源码)
  4. idea启动tomcat很慢_idea使用maven创建web项目
  5. 专访赵加雨:WebRTC在网易云信的落地
  6. 使用 Bamboo 构建项目的 CICD 过程文档
  7. oracle语句within,oracle中within group的用法
  8. 分析redis中大key的几种办法
  9. 软件开发需要重视对异常的处理
  10. 【STC15库函数上手笔记】7、PCA与PWM
  11. latex 作者加小标_Latex 写期刊论文的小技巧
  12. android 用户中心布局,android用户中心头像选择功能的方法实现-Go语言中文社区
  13. GDAL\OGR读取数据示例 C#版本
  14. 二位数组的示例 go语言
  15. CSS实现左侧固定大小,右侧自适应的布局
  16. html判断安装没安装qq,QQ提示安装路径无效您没有权限怎么办 QQ2015提示安装路径无效您没有权限的解决方法...
  17. winpe加载raid_winpe里添加raid驱动
  18. R语言_缺失值NA的处理
  19. Laravel文档 翻译合集
  20. OpenGL开启Gouraud明暗处理,减少马赫夫效应

热门文章

  1. 如使用JDBC连接Mysql数据库
  2. xhr返回值_XMLHttpRequest发送POST、GET请求以及接收返回值
  3. 用硬盘安装linux物理机,老爷机安装UBUNTU的悲剧之旅(附用GRUB2硬盘安装ubuntu教程)...
  4. python string.format(),Python string.format()百分比,不取整
  5. tcplayer currenttime设置不成功_为什么你的“会员体系”不成功?权益设置很重要...
  6. android.mk 编译jar包,Androidmk 使用详解
  7. matlab中的运算函数,基于Matlab软件的函数运算在实践中的应用
  8. Java Web学习笔记03:JSP元素
  9. 【Tyvj1783】【codevs2418】【BZOJ1856】字符串,厉害的组合数与模型转换
  10. 【codevs1285】【BZOJ1208】宠物收养所,splay练习