空间小游戏“大大挂武林技能”有挂吗?可以出钱买

当前位置: &
& 空间先生
这款《空间先生》(Mr.Space!!)的题材相当有趣,在天花板落下之前移动到可以容身的地方,来避开被天花板压成薄片的下场。玩法和操作很简单,在天花板落下前躲到可以容身的空...
方向键←→控制移动。
游戏加载完毕点击[简体中文] - 接着点击[开始游戏] - 再点击游戏页面即可开始游戏
考考你的观察能力,躲过每一次碾压吧!
2345出品游戏是一款小游戏,然后是根据所给的元素换衣服参加比赛得金币可以买衣服的,然后这游戏有好几个系列_百度知道
是一款小游戏,然后是根据所给的元素换衣服参加比赛得金币可以买衣服的,然后这游戏有好几个系列
是一款小游戏,然后是根据所给的元素换衣服参加比赛得金币可以买衣服的,然后这游戏有好几个系列系列有巴黎的米兰的什么的,忘记名字了
我有更好的答案
Fashion lcon
楼主,你找到答案了吗??我好像有玩过,好像是个英文名字
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。&figure&&img src=&https://pic1.zhimg.com/v2-805bd03b7f59e0dfab86360_b.jpg& data-rawwidth=&832& data-rawheight=&351& class=&origin_image zh-lightbox-thumb& width=&832& data-original=&https://pic1.zhimg.com/v2-805bd03b7f59e0dfab86360_r.jpg&&&/figure&&p&先大概列下这段代码:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fixed4 tangentNormal = tex2D(_MainNormalTex,i.uv.zw);
fixed3 bump = UnpackNormal(tangentNormal);
fixed3 worldBump = (half3( dot(i.T2W0.xyz,bump),
dot(i.T2W1.xyz,bump),
dot(i.T2W2.xyz,bump)));
half bumpLen = length(worldBump);//获得法线长度
worldBump /= bumpL
roughness = saturate(roughness + min(0.4,saturate(1.0 - bumpLen) * _Factor));
&/code&&/pre&&/div&&p&前面都是耳熟能详的法线贴图相关代码,但在归一化的时候,却获取了法线长度,并且将它和1的差值以一定比例加到了粗糙度上。&/p&&p&由于T2W012计算是在顶点上完成的,frag阶段进行的硬件插值,因为是线性插值(Lerp)而不是球插值(Slerp),确实会不等于1。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-aa0c3ed9ccbf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&720& data-rawheight=&376& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic1.zhimg.com/v2-aa0c3ed9ccbf_r.jpg&&&/figure&&p&放大3倍着色出来确实也能看到。多边形中间的部分,算出来的法线长度会稍微短一点。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-91bebfac757541_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&308& data-rawheight=&284& class=&content_image& width=&308&&&/figure&&p&但这样的东西又有什么意义呢?&/p&&hr&&p&所以跑群里问了下(虽然问的是完全不同的东西),搞到中途也开始偏题了,开始扯别的。这时候突然有人冒出来插了这么一句:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f8ef6e59cc8dce_b.jpg& data-size=&normal& data-rawwidth=&353& data-rawheight=&568& class=&content_image& width=&353&&&figcaption&我问“你在说啥”是因为目前在说的话题有两个&/figcaption&&/figure&&p&因为我既没有贴代码也没贴图,也完全没提粗糙度的事情,也就提到了法线贴图和弥赛亚,他却突然冒出来roughness这个词,我就觉得他应该知道点什么。&/p&&p&但可能是他觉得我们这点事都不知道很LOW吧,说完“说个几把”之后就退群了,我也不好去问了。&/p&&p&而他提到的这个SpecularAA,我查了下大概是指这类问题:&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//gamedev.stackexchange.com/questions/84186/fighting-aliasing-on-specular-highlights& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Fighting aliasing on specular highlights&/a&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-95d75075eadf8cc2bc6613_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&668& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&668& data-original=&https://pic3.zhimg.com/v2-95d75075eadf8cc2bc6613_r.jpg&&&/figure&&p&这个确实是个问题,是采样不足,采样点又恰好到了高光最亮的地方产生的现象。准确的解决方法就只有增加采样,或者用不仅仅针对几何边缘的屏幕反锯齿技术,诸如FXAA,TAA一类。&/p&&p&而这个地址还有人给了一个利用fwidth的方法(根据屏幕两个像素法线的变化率来决定高光的衰减量,相当于增加粗糙度)&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&float3 ddxN = ddx(Normal.rgb);
float3 ddyN = ddy(Normal.rgb);
float curv2 = max( dot( ddxN, ddxN ), dot( ddyN, ddyN ) );
float gloss_max = -0.0909h - 0.0909h * log2(CURV_MOD*curv2);
gloss = min(gloss, gloss_max);
gloss = min(MAX_POW, exp2(1 + lerp(POW_MOD_MIN, POW_MOD_MAX, gloss )));
&/code&&/pre&&/div&&p&这些做法我都能理解。&/p&&p&&br&&/p&&p&但是单单取法线的长度值来增加粗糙度,这为啥就能解决高光采样不足的问题呢?&/p&&p&&br&&/p&&p&是,如果把“法线换算成世界空间后才取长度”看做一个笔误,又或者是觉得插值导致的误差可以忽略,想省略一次normalize指令(后面的normalize指令在归一的化的时候本来就必须做),那有可能他们实际想获取的是法线贴图当前像素的长度。假如法线纹理数据不是归一化的,就可以利用其长度储存一些信息,比如“法线的梯度”,再利用这个梯度增加粗糙度。&/p&&p&也就是让法线变化快的区域高光弱一点。&/p&&p&但是我们要的并不是“法线变化快-&高光变弱”吧?而是“屏幕上两点法线变化快-&高光变弱”吧?&/p&&p&不考虑对近处物体的影响,fwidth确实能解决问题。那么是嫌fwidth是ES3专用,不得不用其他效果更差的方式代替?&/p&&p&但不用fwidth的话,用法线纹理上的固定梯度来减少粗糙度,相当于直接修改粗糙度纹理。这一切计算都是和视距没有关系的,而AA则应该在高光采样不足的远处开始执行。所以说,就算真的要这样做,至少也该把视距当做粗糙度增加的系数吧?&/p&&p&&br&&/p&&p&当然我突然想到了,除了在frag上直接求视距外,还有什么是本身就和视距相关的呢?&/p&&p&&b&MipMap。&/b&&/p&&p&所以,我们并不需要计算视距,只要让法线贴图各级mipMap的长度值影响系数依次递减,就能够让近处的物体不受影响,而远处的物体高光在某些部分变糊。&/p&&hr&&p&但在实际做的时候,出了一个问题:我很难去复现SpecularAA出现的情形(就是那个门的白色杂点)。复现不了,也就无法去验证是否修复。&/p&&p&因为按照一般的mipMap算法,法线贴图的xy坐标在mipMap的高层级会因为插值变得很小,也就是会变得“方向几乎一致”“平滑”,只有把MipMap去掉才能看到比较明显的高光反走样。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c5daedbe9caf_b.jpg& data-size=&normal& data-rawwidth=&318& data-rawheight=&303& class=&content_image& width=&318&&&figcaption&原图&/figcaption&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-aea09b079c7deea86bca_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&240& data-rawheight=&205& data-thumbnail=&https://pic4.zhimg.com/v2-aea09b079c7deea86bca_b.jpg& class=&content_image& width=&240&&&/figure&&p&但如果开着MipMap,法线基本上就被抹平了,想想也是该这么回事儿。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8e083ebd014fdd7bcf003_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&389& data-rawheight=&350& data-thumbnail=&https://pic1.zhimg.com/v2-8e083ebd014fdd7bcf003_b.jpg& class=&content_image& width=&389&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-96af8cafe97a9ebe6de88a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&240& data-rawheight=&205& data-thumbnail=&https://pic2.zhimg.com/v2-96af8cafe97a9ebe6de88a_b.jpg& class=&content_image& width=&240&&&/figure&&p&难道说是因为他们不开法线贴图的MipMap?不至于吧?&/p&&p&这种做法倒是也听说过,毕竟开了MipMap,就必须开三线以及各向异性过滤,否则纹理很容易出现斜面模糊,MipMap的断层。此外,就是这个法线细节丢失的问题。&/p&&p&但是,关闭MipMap会面临带宽压力和更严重的纹理走样问题,这通常是没有其他办法后的最终手段。&/p&&p&&br&&/p&&p&这时候我想到了之前看过的这篇文章的内容:&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&【SIGGRAPH2017】Physically Based Material Where Are We&/a&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ddff1511ae79f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&741& data-rawheight=&704& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic4.zhimg.com/v2-ddff1511ae79f_r.jpg&&&/figure&&p&既然开了mipMap存在这个变“光滑”的问题,而开了mipMap实际上不容易出现高光反走样,那么有没有可能,楚留香这个“粗糙度+=法线长度”根本就不是为了解决高光反走样,而是为了解决这个物体远距离变光滑的问题?&/p&&figure&&img src=&https://pic2.zhimg.com/v2-c4c2fe8fca665b13b1554bacc3735136_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&412& data-rawheight=&304& data-thumbnail=&https://pic2.zhimg.com/v2-c4c2fe8fca665b13b1554bacc3735136_b.jpg& class=&content_image& width=&412&&&/figure&&p&原有的法线细节被搞没了,用粗糙度补回来一些,合情合理。&/p&&hr&&p&但在实际编辑法线的多级MipMap数据时,很自然地发现了一个现象。&/p&&p&而且之前就有疑问,既然要在法线纹理上藏粗糙度偏移,那干嘛不直接在粗糙度纹理上直接偏移呢?就算有多级MipMap要做的事情也是一样的——但是,假如法线部分什么都不处理就能就预期的效果,直接取就好了,当然就没必要去修改粗糙度纹理了。&/p&&p&要点就是,原始法线图本身事先编辑成归一化的(相对于0.5,0.5),但是经过Box算法插值出其他级别的MipMap后,并不对它们归一化,而是任由它们由于相邻像素线性插值而损失长度(纹理类型应该是Default,而非Normal Map)。产生的结果就如同下图:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-adae648f35b5b688029fa_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&503& data-rawheight=&284& class=&origin_image zh-lightbox-thumb& width=&503& data-original=&https://pic2.zhimg.com/v2-adae648f35b5b688029fa_r.jpg&&&/figure&&p&会因为相邻像素差异而失去“向量长度”,而且方向差异越大,失去的“长度”越多。&/p&&p&这直接就是我们想要的结果。&/p&&p&着色后可以看到length的平均值确实会因为距离远而变低。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c80362e8feca36ed7f7e23a23044b7bb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&389& data-rawheight=&334& data-thumbnail=&https://pic4.zhimg.com/v2-c80362e8feca36ed7f7e23a23044b7bb_b.jpg& class=&content_image& width=&389&&&/figure&&p&最近的距离不是纯白是因为在同一级mipMap中相邻像素依然会因为Bilinear过滤而降低length,如果用点采样就是纯白的。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-b6d88e7cd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&377& data-rawheight=&338& class=&content_image& width=&377&&&/figure&&p&所以这样处理法线后,再直接用&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&_Factor = 0.3;
roughness = saturate(roughness + min(0.4,saturate(1.0 - bumpLen) * _Factor));
&/code&&/pre&&/div&&p&就能有“远距离法线变化剧烈部分粗糙度增加”的效果。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-aca7d95ed4c181fe86ce42_b.jpg& data-size=&normal& data-rawwidth=&700& data-rawheight=&350& class=&origin_image zh-lightbox-thumb& width=&700& data-original=&https://pic1.zhimg.com/v2-aca7d95ed4c181fe86ce42_r.jpg&&&figcaption&Before&/figcaption&&/figure&&figure&&img src=&https://pic3.zhimg.com/v2-0deaa985fcef4c0a2640f2be_b.jpg& data-size=&normal& data-rawwidth=&670& data-rawheight=&332& class=&origin_image zh-lightbox-thumb& width=&670& data-original=&https://pic3.zhimg.com/v2-0deaa985fcef4c0a2640f2be_r.jpg&&&figcaption&After&/figcaption&&/figure&&p&但仅仅粗糙度增加……由于高光分布的问题并不能好好地模拟出原本法线产生的粗糙效果,也仅仅是让远处的小球不至于变得“光滑”。但这个Shader产生的效果,恐怕也只能这样。而且这东西也能够稍微缓解SpecularAA的问题。&/p&&p&&br&&/p&&p&另外,如果选择将法线长度的变化量生成到对应物体的粗糙度贴图上,就不用修改Shader了(同时也能避免第一级MipMap用Bilinear过滤导致多余降低的粗糙度)&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Texture2D tex = AssetDatabase.LoadAssetAtPath&Texture2D&(&Assets/bump.png&);
Texture2D resultTex = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, true);
for (int mipLevel = 0; mipLevel & tex.mipmapC mipLevel++)
Color[] colors = tex.GetPixels(mipLevel);
for (int i = 0; i & colors.L i++)
Color c = colors[i];
float len = (new Vector3(c.r, c.g, c.b) * 2f - Vector3.one).
float smooth = Mathf.Clamp01(1f - Mathf.Max(0, 1f - len) * 0.3f);
colors[i] = new Color(1, 1, 1, smooth);
resultTex.SetPixels(colors,mipLevel);
resultTex.Apply(false, false);
resultTex.anisoLevel = 4;
AssetDatabase.CreateAsset(resultTex, &Assets/smoothness.asset&);
AssetDatabase.Refresh();
&/code&&/pre&&/div&&p&&br&&/p&&p&&b&其实我最后也不知道弥赛亚这段代码是干嘛的,因为对实际画面的影响太小了,不容易测试。&/b&&/p&&p&&b&但管它的,自己能用,能出效果不就行了。&/b&&/p&&p&&b&咱又不是它肚里的蛔虫,他自己不出来说,谁知道这个有什么用。&/b&&/p&&p&&b&反正这东西不开MipMap是肯定没效果的,但开了MipMip又很难看到剧烈变化的法线。除非它的MipMap生成方式特殊。&/b&&/p&&hr&&p&最后一定要说明的一点是,我这个球的纹理只是个演示例子,搞张比较容易出事儿的法线贴图而已。&/p&&p&真想解决这个球本身的问题,其实把mipMap Filter设成Kaiser就可以了。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d89f989ede79bfd112310b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&373& data-rawheight=&127& class=&content_image& width=&373&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-467e9fedacdea18c514932_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&389& data-rawheight=&350& data-thumbnail=&https://pic2.zhimg.com/v2-467e9fedacdea18c514932_b.jpg& class=&content_image& width=&389&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-ba86c8c7f1fcdd8bcbe5f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&389& data-rawheight=&334& data-thumbnail=&https://pic4.zhimg.com/v2-ba86c8c7f1fcdd8bcbe5f_b.jpg& class=&content_image& width=&389&&&/figure&&p&&br&&/p&&p&两者叠加?&/p&&figure&&img src=&https://pic2.zhimg.com/v2-0c7f92febaa_b.jpg& data-size=&normal& data-rawwidth=&708& data-rawheight=&321& class=&origin_image zh-lightbox-thumb& width=&708& data-original=&https://pic2.zhimg.com/v2-0c7f92febaa_r.jpg&&&figcaption&Before&/figcaption&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-abfa7b1ad6cf5af5e6c4_b.jpg& data-size=&normal& data-rawwidth=&720& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&720& data-original=&https://pic4.zhimg.com/v2-abfa7b1ad6cf5af5e6c4_r.jpg&&&figcaption&After&/figcaption&&/figure&&p&&br&&/p&&hr&&p&&br&&/p&&p&另外当时群里讨论的其实是个和上面完全无关的问题,是关于这个的,所以有人能扯到roughness和高光上才令人意外:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ff554db096f6e28d33843a3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&672& data-rawheight=&334& data-thumbnail=&https://pic1.zhimg.com/v2-ff554db096f6e28d33843a3_b.jpg& class=&origin_image zh-lightbox-thumb& width=&672& data-original=&https://pic1.zhimg.com/v2-ff554db096f6e28d33843a3_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-ad864cb0d92daaae3365d_b.jpg& data-size=&normal& data-rawwidth=&418& data-rawheight=&285& class=&content_image& width=&418&&&figcaption&就是普通的凹凸贴图,无高光&/figcaption&&/figure&&p&这个要有谁知道能怎么解决还望提点一下啊。&/p&
先大概列下这段代码:fixed4 tangentNormal = tex2D(_MainNormalTex,i.uv.zw);
fixed3 bump = UnpackNormal(tangentNormal);
fixed3 worldBump = (half3( dot(i.T2W0.xyz,bump),
dot(i.T2W1.xyz,bump),
dot(i.T2W2.xyz,bump)));
half bumpLen = length(wo…
&figure&&img src=&https://pic1.zhimg.com/v2-bdd71c444a7bfef9e044c969_b.jpg& data-rawwidth=&1208& data-rawheight=&681& class=&origin_image zh-lightbox-thumb& width=&1208& data-original=&https://pic1.zhimg.com/v2-bdd71c444a7bfef9e044c969_r.jpg&&&/figure&&p&这次GGJ上尝试了 下硬件粒子。&/p&&p&最早在maya里面做特效的时候用到过,前几年被加入了次时代标准。 不过当时一直在做国产垃圾商业游戏,没时间研究。&/p&&p&&br&&/p&&p&这次正好我们想的一个很禅意的游戏里要做拖尾和扰动效果, 然后我就想到了用 硬件粒子做,正好也没尝试过,顺便攒下个新技术。&/p&&p&网上找了一圈后发现中文资料太少,都是直接翻译的国外资料,官方文档也写的很烂,所以就打算自己写一个清晰点的教程方便要用的小伙伴。当时做项目的时候找了两个小时没看到啥好的资料和教程,后来github上搜到一个示例项目才学会则么用。&/p&&p&先放个效果图&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8c5c04b9e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&844& data-rawheight=&464& class=&origin_image zh-lightbox-thumb& width=&844& data-original=&https://pic1.zhimg.com/v2-8c5c04b9e_r.jpg&&&/figure&&a class=&video-box& href=&https://link.zhihu.com/?target=https%3A//www.zhihu.com/video/173440& target=&_blank& data-video-id=&& data-video-playable=&true& data-name=&& data-poster=&https://pic1.zhimg.com/80/v2-2e83f3d7aea76d955a240b222b155a98_b.jpg& data-lens-id=&173440&&
&img class=&thumbnail& src=&https://pic1.zhimg.com/80/v2-2e83f3d7aea76d955a240b222b155a98_b.jpg&&&span class=&content&&
&span class=&title&&&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&https://www.zhihu.com/video/173440&/span&
&p&&br&&/p&&p&对 compute shader 没有什么概念的建议先去看看 GPGPU相关概念.&/p&&p&简单来说就是用 GPU 来计算一些可以并行计算的数据,可以比cpu计算快很多倍。&/p&&p&这个项目里面同时渲染了 100w 左右的粒子, 60帧满帧 + 97% 的 cpu剩余空闲。当然本身也不是cpu在算所以肯定是不吃cpu的。&/p&&p&&br&&/p&&p&实现效果主要用到了 &/p&&p&c# 脚本 负责整体控制&/p&&p&compute shader 负责GPU计算&/p&&p&shader 负责渲染&/p&&p&&br&&/p&&p&涉及到比较重要的是&/p&&p&ComputeBuffer 类, 用于传递自定义数据。每组自定义结构需要一个 ComputeBuffer&/p&&p&Graphics.DrawProcedural 函数, 用于渲染粒子&/p&&p&&br&&/p&&p&然后 ComputeShader 里是可以引入各种 Shader库的&/p&&p&跟shader里用法一样直接 #include 就好&/p&&p&&br&&/p&&p&&b&可以自定义数据结构,但是 c#、 ComputeShader、 Shader 三个脚本的数据必须一致,不然内存对不齐会读错。&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&项目参考了github 上的&/p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/krylov-na/Compute-shader-particles& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic2.zhimg.com/v2-a1bea0fa2e1e1ffd835e14d_ipico.jpg& data-image-width=&420& data-image-height=&420& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&krylov-na/Compute-shader-particles&/a&&p&&br&&/p&&p&自己代码太乱就直接用github的代码讲解了。&/p&&p&c# 脚本用来整体控制&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&using System.C
using System.Collections.G
using System.Runtime.InteropS
using UnityE
public class ParticlesManager : MonoBehaviour {
//自定义结构用于基础数据在cpu和gpu运算间传递
public struct Particle
public Vector2
public Vector2
public ComputeShader computeS
const int WARP_SIZE = 1024;
//粒子数量
int size = 1024000;
int kernelI
Particle[] initB
/*private void OnDrawGizmos()
var p = new Particle[size];
particles.GetData(p);
for (int i = 0; i & i++)
Gizmos.DrawSphere(p[i].position, 0.1f);
// Use this for initialization
void Start () {
//运算次数
warpCount = Mathf.CeilToInt((float)size / WARP_SIZE);
//计算数据所占内存大小
stride = Marshal.SizeOf(typeof(Particle));
//ComputeBuffer 用于向ComputeShader 传递自定义结构
particles = new ComputeBuffer(size, stride);
initBuffer = new Particle[size];
for (int i = 0; i & i++)
initBuffer[i] = new Particle();
initBuffer[i].position = Random.insideUnitCircle * 10f;
initBuffer[i].velocity = Vector2.
//写入 数据到 computeBuffer
//之后会用于在 cpu 到 compute shader 到 shader 直接传递参数
particles.SetData(initBuffer);
//Compute Shader 里可执行函数的 id, 后面update里调用
//Update 为Compute Shader 里函数的 函数名
kernelIndex = computeShader.FindKernel(&Update&);
//为compute shader 的 函数 写入数据buffer
computeShader.SetBuffer(kernelIndex, &Particles&, particles);
//为shader 写入数据buffer
material.SetBuffer(&Particles&, particles);
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.R))
//重置buffer 往compute shader 里更新自定义数据也是这样写
particles.SetData(initBuffer);
//传递 int float Vector3 等数据 Vector2 和 Vector3 要转成 float[2]
//float[3] 才可以用
computeShader.SetInt(&shouldMove&, Input.GetMouseButton(0) ? 1 : 0);
var mousePosition = GetMousePosition();
computeShader.SetFloats(&mousePosition&, mousePosition);
computeShader.SetFloat(&dt&, Time.deltaTime);
//执行一次compute shader 里的函数
computeShader.Dispatch(kernelIndex, warpCount, 1, 1);
float[] GetMousePosition()
var mp = Input.mouseP
var v = Camera.main.ScreenToWorldPoint(mp);
return new float[] { v.x, v.y };
//渲染效果
void OnRenderObject()
//写入材质球 pass
material.SetPass(0);
//渲染粒子
Graphics.DrawProcedural(MeshTopology.Points, 1, size);
void OnDestroy()
if (particles != null)
particles.Release();
&/code&&/pre&&/div&&p&&br&&/p&&p&然后是重点 ComputeShader&/p&&p&其实非常简单&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&#pragma kernel Update
//刚开始奇怪没有API 难道所有的基础运算函数都要自己实现?!
//后来发现可以引入 cg 库
//直接 #include 即可
//#include &UnityCG.cginc&
//接收的结构体buffer 必须跟 c# 脚本 和 shader 脚本里的一致,不然内存对不齐会出bug
struct Particle
int shouldM
float2 mouseP
RWStructuredBuffer&Particle& P
//可执行的函数
//numthreads 是一次调用的批处理次数 括号里是 id
//id 用 id.x id.y id.z 来访问
[numthreads()]
void Update(uint3 id : SV_DispatchThreadID)
if (shouldMove & 0) {
float2 v = float2(mousePosition.x - Particles[id.x].position.x, mousePosition.y - Particles[id.x].position.y);
float d2 = v.x * v.x + v.y * v.y;
Particles[id.x].velocity = Particles[id.x].velocity + 5 * (v / d2) *
Particles[id.x].position = Particles[id.x].position + Particles[id.x].velocity *
&/code&&/pre&&/div&&p&&br&&/p&&p&最后是渲染 Shader&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&Shader &Subway/Particles&
Properties
_ColorLow(&Color Slow Speed&, Color) = (0, 0, 0.5, 1)
_ColorHigh(&Color High Speed&, Color) = (1, 0, 0, 1)
_HighSpeedValue(&High speed Value&, Range(0, 50)) = 25
Blend SrcAlpha one
#pragma target 5.0
#pragma vertex vert
#pragma fragment frag
#include &UnityCG.cginc&
// 自定义的数据结构, 必须跟 c# 和 compute shader 里的结构体一致
// Particle's data
struct Particle
//基本上就是正常的shader
// Pixel shader input
struct PS_INPUT
float4 position : SV_POSITION;
float4 color : COLOR;
//声明使用的 buffer
// Particle's data, shared with the compute shader
StructuredBuffer&Particle& P
// Properties variables
uniform float4 _ColorL
uniform float4 _ColorH
uniform float _HighSpeedV
// Vertex shader
PS_INPUT vert(uint vertex_id : SV_VertexID, uint instance_id : SV_InstanceID)
PS_INPUT o = (PS_INPUT)0;
//调用 buffer里的数据
float speed = length(Particles[instance_id].velocity);
float lerpValue = clamp(speed / _HighSpeedValue, 0.0f, 1.0f);
o.color = lerp(_ColorLow, _ColorHigh, lerpValue);
// Position
o.position = UnityObjectToClipPos(float4(Particles[instance_id].position, 0.0f, 1.0f));
// Pixel shader
float4 frag(PS_INPUT i) : COLOR
Fallback Off
&/code&&/pre&&/div&&p&&br&&/p&&p&大概就这些东西了&/p&
这次GGJ上尝试了 下硬件粒子。最早在maya里面做特效的时候用到过,前几年被加入了次时代标准。 不过当时一直在做国产垃圾商业游戏,没时间研究。 这次正好我们想的一个很禅意的游戏里要做拖尾和扰动效果, 然后我就想到了用 硬件粒子做,正好也没尝试过,顺…
&figure&&img src=&https://pic1.zhimg.com/v2-d1f78aab480c732a6d9d7_b.jpg& data-rawwidth=&1280& data-rawheight=&686& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&https://pic1.zhimg.com/v2-d1f78aab480c732a6d9d7_r.jpg&&&/figure&&p&Unity对Shader文件进行编译的时候,DX9和DX11的版本会直接生成汇编码。&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&length(i.worldPos)
&/code&&/pre&&/div&&p&DX9&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&dp4 r0.x, v0, v0
rsq r0.x, r0.x
rcp_pp oC0, r0.x
&/code&&/pre&&/div&&p&DX11&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&dp4 r0.x, v1.xyzw, v1.xyzw
sqrt o0.xyzw, r0.xxxx
&/code&&/pre&&/div&&p&&br&&/p&&p&由于这些代码是最终的指令,大部分指令执行时间是“差不多”的,可以用来预估计算量。但移动平台则是各厂商驱动各自进行的编译,各家都不一样,不好判断。&/p&&p&但DX9毕竟针对的是非常古老的硬件,很难想象现代GPU还会和它保持一样。实际的指令应该会更接近于DX11。&/p&&p&&br&&/p&&p&以下为列表(用|隔开的数据,前面的部分是计算单分量时的指令数,后面的部分是计算float4时的指令数)&/p&&figure&&img src=&https://pic4.zhimg.com/v2-afa7d1b6c3a0e2f957dd3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&410& data-rawheight=&911& class=&content_image& width=&410&&&/figure&&p&总结一下便是:&/p&&ul&&li&反三角函数非常费&/li&&li&abs和saturate是免费的&/li&&li&除了反三角函数外,fmod和smoothstep比预期更费&/li&&li&log,exp,sqrt(单分量)的成本实际上很低,所以由他们组合成的pow也不高&/li&&li&sin,cos在DX11使用了专门一条单指令,成为了低成本函数&/li&&/ul&&p&另外还有个基本常识:绝大部分GPU是一次性计算4个分量,计算一个float4和只计算单个float耗时是一样的。当计算float时,剩下三个分量的时长会被浪费。&/p&&p&&br&&/p&&p&然而,每条指令的时间成本确实可能是不一样的。这个和具体硬件有关。&/p&&p&很难找到移动平台具体GPU的数据,可以参考下文看看一些主流GPU的情况,相信他们总是有一些共性的。&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//www.fractalforums.com/programming/shader-function-or-instruction-cost-%28performance%29/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&shader function or instruction cost (performance)&/a&&/p&&p&&br&&/p&&p&结果是,1/x, sin(x), cos(x), log2(x), exp2(x), 1/sqrt(x)这些指令的时间成本是一样的,而且和普通的四则运算很接近(个人猜测是通过查表实现的)。&/p&&p&但是sin,cos毕竟在旧硬件上成本较高,由于不清楚硬件的具体情况,还是要尽可能少用。&/p&&p&&br&&/p&&hr&&p&&br&&/p&&p&预估成本还有一个办法,是根据公开的GPU的&b&GFLOPS(Floating-point Operations Per Second每秒执行浮点运算次数)&/b&&/p&&a href=&http://link.zhihu.com/?target=https%3A//gflops.surge.sh/& data-draft-node=&block& data-draft-type=&link-card& data-image=&https://pic2.zhimg.com/v2-1ddd83f2eed_180x120.jpg& data-image-width=&188& data-image-height=&128& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GPU GFLOPS&/a&&p&来评估每个着色器理论极限算力,便能知道一个着色器里可以允许多少条基本指令。&/p&&p&这当然很不精确,因为纹理采样,顶点,光栅化等等众多成本都没有考虑在内,但是有一定的参考价值。&br&&/p&&p&iPhone 4s使用的芯片是Apple A5,它的FLOPS是12.8G,屏幕分辨率是960x640,分到一帧的一个像素后,结果是&/p&&p&12.8*/640/60 = 372&b&。&/b&&/p&&p&根据FLOPS的定义,时间最短的基本指令“乘加(MAD)”需要花掉2FLOPS,那么单个屏幕像素能执行186条指令。&/p&&p&假设Overdraw是5,那么一个像素着色器能执行37指令。&/p&&p&&br&&/p&&p&虽然37指令这个结果显然比实际多多了,但起码是在合适的数量级范围内。可以通过帧率测试来计算“损耗比例”到底是多少。&/p&&p&而且,这样做我们其实得到了一个上限值。如果你在像素单元的指令数超过了37(比如用了两次atan2),那从物理角度是绝对不可能达到满帧的。&/p&
Unity对Shader文件进行编译的时候,DX9和DX11的版本会直接生成汇编码。length(i.worldPos)DX9dp4 r0.x, v0, v0
rsq r0.x, r0.x
rcp_pp oC0, r0.xDX11dp4 r0.x, v1.xyzw, v1.xyzw
sqrt o0.xyzw, r0.xxxx 由于这些代码是最终的指令,大部分指令执行时间是“差…
&figure&&img src=&https://pic3.zhimg.com/v2-e8126dbe267aeb_b.jpg& data-rawwidth=&2816& data-rawheight=&1437& class=&origin_image zh-lightbox-thumb& width=&2816& data-original=&https://pic3.zhimg.com/v2-e8126dbe267aeb_r.jpg&&&/figure&&p&&/p&&h2&&b&系列文章前言&/b&&/h2&&p&&br&&/p&&p&《GPU Gems》1~3 、《GPU Pro》1~7 以及《GEM Zen》组成的GPU精粹系列书籍,是游戏开发、计算机图形学和渲染领域的业界大牛们优秀经验的分享合辑汇编,是江湖各大武林门派绝学经典招式的精华荟萃,可谓游戏开发、图形学和渲染领域进阶知识精彩绝伦的饕餮盛宴。&/p&&p&&br&&/p&&p&这个系列书籍中所收录的文章不仅有奥斯卡特效大奖得主的成名之作,还有工业光魔业界前沿特效工作室带来的精彩分享,各种著名的游戏工作室、知名游戏引擎一线开发人员的肺腑之言,以及各式图形学大牛的经验之谈,可谓字字珠玑,干货无数。&/p&&p&&br&&/p&&p&而因为出版风格的相似性,都是出版当代前沿的图形学文章精粹的合辑汇编,我们可以将《GPU Gems》1~3 、《GPU Pro》1~7 以及《GEM Zen》组成的GPU系列书籍,目前共11本书,合称为“GPU精粹三部曲“。&/p&&p&&br&&/p&&p&可以毫不夸张地说,“GPU精粹三部曲“这11本书,是图形学和渲染爱好者站在巨人的肩膀上,了解图形学业界各种高阶知识和技法Trick,将自己的图形学与渲染能力进阶提升到下一个高度的捷径之一&i&。&/i&&/p&&p&&br&&/p&&p&而如果你要造轮子,自己开发3D引擎,书中的不少Trick,前人踩坑的经验总结,也会对你有帮助。&/p&&p&&br&&/p&&p&我们可以用一张图来了解“GPU精粹三部曲”目前11本书的面世顺序。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-570c74c9f1a845f7042461dfa3000da5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1790& data-rawheight=&2665& class=&origin_image zh-lightbox-thumb& width=&1790& data-original=&https://pic1.zhimg.com/v2-570c74c9f1a845f7042461dfa3000da5_r.jpg&&&/figure&&p&图 GPU精粹三部曲&/p&&p&&br&&/p&&p&有趣的是,虽说是三部曲,但其中的每一部,分别由不同的出版社出版: &/p&&ul&&li&Addison-Wesley出版社的《GPU Gems 1~3》 &/li&&li&CRC Press出版社的《GPU Pro 1~7》 &/li&&li&Black Cat Publishing出版社的《GPU Zen》 &/li&&/ul&&p&&br&&/p&&p&另外值得注意的是,这三部曲其中仅有《GPU Gems 1~3》有中文版,对应为人民邮电出版社出版的《GPU精粹1》,清华大学出版社出版的《GPU精粹2~3》。&/p&&p&&br&&/p&&p&总之,“GPU精粹三部曲”是图形学进阶学习的大宝藏,是图形学和渲染领域进阶知识的饕餮盛宴。如果你希望进阶地学习图形学、渲染以及Shader编程,仔细研读,认真实践,一定会受益匪浅。&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&系列文章写作风格说明&/b&&/h2&&p&&br&&/p&&p&这个系列,会总结和提炼“GPU精粹三部曲”11本书中总计200+篇关于游戏开发与渲染的核心内容,暂定每篇文章提炼“GPU精粹三部曲”中一本书的核心内容。&/p&&p&&br&&/p&&p&暂定对每本书中每章的提炼字数控制在500字以内,而每篇文章,将由20章左右的内容组成。具体的章节分布,可以在下文的核心内容列表一览中看到。&/p&&p&&br&&/p&&p&也因为是每篇文章需要提炼一整本书的内容,篇幅有限,只能是抓住重点和核心内容去总结,无法做到事无巨细,每章都交代足够的细节。如果你通过阅读这个系列文章,发现有些章节你很感兴趣,便可以找到原书中对应的原章节,进行进一步详细了解和研究。&/p&&p&&br&&/p&&p&而写作顺序方面,自然是按照书籍的出版时间正序进行,即第一篇正式文章,提炼总结《GPU&br&Gems 1》的内容,最后一篇正式文章,提炼《GPU Zen》的内容。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&关于GPU精粹三部曲的有用链接&/b&&/h2&&p&&br&&/p&&ul&&li&《GPU Gem》1~3 的英文原文web版,已经由NVIDIA开源,链接在这里:&a href=&https://link.zhihu.com/?target=https%3A//developer.nvidia.com/gpugems/GPUGems/gpugems_pref01.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&developer.nvidia.com/gp&/span&&span class=&invisible&&ugems/GPUGems/gpugems_pref01.html&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&《GPU Pro》 1~7和《GPU Zen》等8本书的主编都是图形大牛 Wolfgang Engel。这边是Wolfgang Engel的博客主页:&a href=&https://link.zhihu.com/?target=https%3A//www.blogger.com/profile/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&blogger.com/profile/110&/span&&span class=&invisible&&97662&/span&&span class=&ellipsis&&&/span&&/a&&/li&&li&以及Wolfgang Engel维护的《GPU Pro》系列书籍的博客地址:&a href=&https://link.zhihu.com/?target=http%3A//gpupro.blogspot.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&gpupro.blogspot.com/&/span&&span class=&invisible&&&/span&&/a&&/li&&li&还有Wolfgang Engel维护的《GPU Zen》系列书籍的博客地址:&a href=&https://link.zhihu.com/?target=https%3A//gpuzen.blogspot.com/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&gpuzen.blogspot.com/&/span&&span class=&invisible&&&/span&&/a&&/li&&/ul&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&GPU精粹全系列核心内容列表一览&/b&&/h2&&p&&br&&/p&&p&前文已经提到,“GPU精粹三部曲”全系列共11本书,具体列举如下:&/p&&ul&&li&GPU Gems 1 [2004]&/li&&li&GPU Gems 2 [2005]&/li&&li&GPU Gems 3 [2006]&/li&&li&GPU Pro 1 [2010]&/li&&li&GPU Pro 2 [2011]&/li&&li&GPU Pro 3 [2012]&/li&&li&GPU Pro 4 [2013]&/li&&li&GPU Pro 5 [2014]&/li&&li&GPU Pro 6 [2015]&/li&&li&GPU Pro 7 [2016]&/li&&li&GPU Zen [2017]&/li&&/ul&&p&以下对每本书的核心章节分别进行目录式列举。&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&一、第一本书《GPU Gems 1(GPU精粹1)》&/b&&/h2&&figure&&img src=&https://pic1.zhimg.com/v2-acb3b843c545ef8ea86ea2fc_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&461& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&461& data-original=&https://pic1.zhimg.com/v2-acb3b843c545ef8ea86ea2fc_r.jpg&&&/figure&&p&&br&&/p&&h2&1.1 第一部分 自然效果的渲染(Natural Effects)&/h2&&p&第1章 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)&/p&&p&第2章 水焦散的渲染(Rendering Water Caustics)&/p&&p&第3章 Dawn Demo中的皮肤(Skin in the &Dawn& Demo)&/p&&p&第4章 Dawn Demo中的动画(Animation in the &Dawn& Demo)&/p&&p&第5章 改良的Perlin噪声实现(Implementing Improved Perlin Noise)&/p&&p&第6章 Vulcan Demo中的火焰渲染(Fire in the &Vulcan& Demo)&/p&&p&第7章 无尽波动草叶的渲染(Rendering Countless Blades of Waving Grass)&/p&&p&第8章 衍射的模拟(Simulating Diffraction)&/p&&p&&br&&/p&&h2&1.2 第二部分 光照和阴影(Lighting and Shadows)&/h2&&p&第9章 有效的阴影体渲染(Efficient Shadow Volume Rendering)&/p&&p&第10章 电影级光照(Cinematic Lighting)&/p&&p&第11章 阴影贴图抗锯齿(Shadow Map Antialiasing)&/p&&p&第12章 全方位阴影映射(Omnidirectional Shadow Mapping)&/p&&p&第13章 使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)&/p&&p&第14章 透视阴影贴图(Perspective Shadow Maps: Care and Feeding)&/p&&p&第15章 逐像素光照的可见性管理(Managing Visibility for Per-Pixel Lighting)&/p&&p&&br&&/p&&h2&1.3 第三部分 材质(Materials)&/h2&&p&第16章 次表面散射的实时近似(Real-Time Approximations to Subsurface Scattering)&/p&&p&第17章 环境光遮蔽(Ambient Occlusion)&/p&&p&第18章 空间BRDF(Spatial BRDFs)&/p&&p&第19章 基于图像的光照(Image-Based Lighting)&/p&&p&第20章 纹理爆炸(Texture Bombing)&/p&&p&&br&&/p&&h2&1.4 第四部分 图像处理(Image Processing)&/h2&&p&第21章 实时辉光(Real-Time Glow)&/p&&p&第22章 颜色控制(Color Controls)&/p&&p&第23章 景深 (Depth of Field)&/p&&p&第24章 高品质的图像滤波(High-Quality Filtering)&/p&&p&第25章 用纹理贴图进行快速滤波宽度的计算(Fast Filter-Width Estimates with Texture Maps)&/p&&p&第26章 OpenEXR图像文件格式(The OpenEXR Image File Format)&/p&&p&第27章 图像处理的框架(A Framework for Image Processing)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&二、第二本书《GPU Gems 2(GPU精粹2)》&/b&&/h2&&figure&&img src=&https://pic3.zhimg.com/v2-16c887e380ae6a7a93d0dec1ddf15d84_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&468& data-rawheight=&645& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&https://pic3.zhimg.com/v2-16c887e380ae6a7a93d0dec1ddf15d84_r.jpg&&&/figure&&p&&br&&/p&&h2&2.1 第一部分 几何复杂性(Geometric Complexity)&/h2&&p&&br&&/p&&p&第1章 实现照片级真实感的虚拟植物(Toward Photorealism in Virtual Botany)&/p&&p&第2章 使用基于GPU几何体剪切图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)&/p&&p&第3章 几何体实例化的内幕(Inside Geometry Instancing)&/p&&p&第4章 分段缓冲(Segment Buffering)&/p&&p&第5章 用多流优化资源管理(Optimizing Resource Management with Multistreaming)&/p&&p&第6章 让硬件遮挡查询发挥作用(Hardware Occlusion Queries Made Useful)&/p&&p&第7章 带有位移映射的细分表面自适应镶嵌(Adaptive Tessellation of Subdivision Surfaces with Displacement Mapping)&/p&&p&第8章 使用距离函数的逐像素位移(Per-Pixel Displacement Mapping with Distance Functions)&/p&&p&&br&&/p&&h2&2.2 第二部分 着色、光照和阴影(Shading, Lighting, and Shadows)&/h2&&p&第9章 S.T.A.L.K.E.R.中的延迟着色(Deferred Shading in S.T.A.L.K.E.R.)&/p&&p&第10章 动态辐照度环境映射实时计算(Real-Time Computation of Dynamic Irradiance Environment Maps)&/p&&p&第11章 近似的双向纹理函数(Approximate Bidirectional Texture Functions)&/p&&p&第12章 基于贴面的纹理映射(Tile-Based Texture Mapping)&/p&&p&第13章 在GPU上实现mental images的phenomena渲染器(Implementing the mental images Phenomena Renderer on the GPU)&/p&&p&第14章 动态环境光遮蔽与间接光照(Dynamic Ambient Occlusion and Indirect Lighting)&/p&&p&第15章 蓝图渲染和草图绘制(Blueprint Rendering and &Sketchy Drawings&)&/p&&p&第16章 精确的大气散射(Accurate Atmospheric Scattering)&/p&&p&第17章 利用像素着色器分支的高效模糊边缘阴影(Efficient Soft-Edged Shadows Using Pixel Shader Branching)&/p&&p&第18章 将顶点纹理位移用于水的真实感渲染(Using Vertex Texture Displacement for Realistic Water Rendering)&/p&&p&第19章 通用的折射模拟(Generic Refraction)&/p&&p&&br&&/p&&h2&3.3 第三部分 高质量渲染(High-Quality Rendering)&/h2&&p&第20章 快速三阶纹理过滤(Fast Third-Order Texture Filtering)&/p&&p&第21章 高质量反走样的光栅化(High-Quality Antialiased Rasterization)&/p&&p&第22章 快速预过滤线条(Fast Prefiltered Lines)&/p&&p&第23章 Nalu Demo中的头发动画和渲染(Hair Animation and Rendering in the Nalu Demo)&/p&&p&第24章 使用查找表加速颜色变换(Using Lookup Tables to Accelerate Color Transformations)&/p&&p&第25章 Apple Motion中的GPU图像处理(GPU Image Processing in Apple's Motion)&/p&&p&第26章 改进的Perlin噪声(Implementing Improved Perlin Noise)&/p&&p&第27章 高级高质量过滤(Advanced High-Quality Filtering)&/p&&p&第28章 Mipmap级的测量(Mipmap-Level Measurement)&/p&&p&&br&&/p&&h2&3.4 第四部分 GPU的通用计算:初级读本(General-Purpose Computation on GPUS: A Primer)&/h2&&p&&br&&/p&&p&第29章 流式体系结构和技术趋势(Streaming Architectures and Technology Trends)&/p&&p&第30章 Geforce 6系列GPU的体系结构(The GeForce 6 Series GPU Architecture)&/p&&p&第31章 把计算概念映射到GPU(Mapping Computational Concepts to GPUs)&/p&&p&第32章 尝试GPU计算(Taking the Plunge into GPU Computing)&/p&&p&第33章 在GPU上实现高效的并行数据结构(Implementing Efficient Parallel Data Structures on GPUs)&/p&&p&第34章 GPU流程控制习惯用法(GPU Flow-Control Idioms)&/p&&p&第35章 GPU程序优化(GPU Program Optimization)&/p&&p&第36章 用于GPGPU应用程序的流式缩减操作(Stream Reduction Operations for GPGPU Applications)&/p&&p&&br&&/p&&h2&3.5 第五部分 面向图像的计算(Image-Oriented Computing)&/h2&&p&第37章 GPU上的八叉树纹理(Octree Textures on the GPU)&/p&&p&第38章 使用光栅化的高质量全局照明渲染(High-Quality Global Illumination Rendering Using Rasterization)&/p&&p&第39章 使用逐步求精辐射度方法的全局照明(Global Illumination Using Progressive Refinement Radiosity)&/p&&p&第40章 GPU上的计算机视觉(Computer Vision on the GPU)&/p&&p&第41章 延迟过滤:困难数据格式的渲染(Deferred Filtering: Rendering from Difficult Data Formats)&/p&&p&第42章 保守光栅化(Conservative Rasterization)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&三、第三本书《GPU Gems 3(GPU精粹3)》&/b&&/h2&&figure&&img src=&https://pic2.zhimg.com/v2-e673a90dd87cba8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&450& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&450& data-original=&https://pic2.zhimg.com/v2-e673a90dd87cba8_r.jpg&&&/figure&&p&&br&&/p&&h2&3.1 第一部分 几何体(Geometry)&/h2&&p&第1章 使用GPU 生成复杂的程序化地形(Generating Complex Procedural Terrains Using the GPU)&/p&&p&第2章 群体动画渲染(Animated Crowd Rendering)&/p&&p&第3章 DirectX 10 混合形状:打破限制(DirectX 10 Blend Shapes: Breaking the Limits)&/p&&p&第4章 下一代SpeedTree 渲染(Next-Generation SpeedTree Rendering)&/p&&p&第5章 普遍自适应的网格优化(Generic Adaptive Mesh Refinement)&/p&&p&第6章 GPU 生成的树的程序式风动画(GPU-Generated Procedural Wind Animations for Trees)&/p&&p&第7章 GPU 上基于点的变形球可视化(Point-Based Visualization of Metaballs on a GPU)&/p&&p&第8章 区域求和的差值阴影贴图(Summed-Area Variance Shadow Maps)&/p&&p&&br&&/p&&h2&3.2 第二部分 光照和阴影(Light and Shadows)&/h2&&p&第9章 使用全局照明实现互动的电影级重光照(Interactive Cinematic Relighting with Global Illumination)&/p&&p&第10章 在可编程GPU 中实现并行分割的阴影贴图(Parallel-Split Shadow Maps on Programmable GPUs)&/p&&p&第11章 使用层次化的遮挡剔除和几何着色器得到高效鲁棒的阴影体(Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders)&/p&&p&第12章 高质量的环境光遮蔽(High-Quality Ambient Occlusion)&/p&&p&第13章 作为后处理的体积光照散射(Volumetric Light Scattering as a Post-Process)&/p&&p&&br&&/p&&h2&3.3 第三部分 渲染(Rendering)&/h2&&p&第14章 用于真实感实时皮肤渲染的高级技术(Advanced Techniques for Realistic Real-Time Skin Rendering)&/p&&p&第15章 可播放的全方位捕捉(Playable Universal Capture)&/p&&p&第16章 Crysis 中植被的程序化动画和着色(Vegetation Procedural Animation and Shading in Crysis)&/p&&p&第17章 鲁棒的多镜面反射和折射(Robust Multiple Specular Reflections and Refractions)&/p&&p&第18章 用于浮雕映射的松散式锥形步进(Relaxed Cone Stepping for Relief Mapping)&/p&&p&第19章 Tabula Rasa 中的延迟着色(Deferred Shading in Tabula Rasa)&/p&&p&第20章 基于GPU的重要性采样(GPU-Based Importance Sampling)&/p&&p&&br&&/p&&p&&br&&/p&&h2&3.4 第四部分 图像效果(Image Effects)&/h2&&p&第21章 真正的Impostor(True Impostors)&/p&&p&第22章 在GPU上烘焙法线贴图(Baking Normal Maps on the GPU)&/p&&p&第23章 高速的离屏粒子(High-Speed, Off-Screen Particles)&/p&&p&第24章 保持线性的重要性(The Importance of Being Linear)&/p&&p&第25章 在GPU 上渲染矢量图(Rendering Vector Art on the GPU)&/p&&p&第26章 通过颜色进行对象探测:使用GPU 进行实时视频图像处理(Object Detection by Color: Using the GPU for Real-Time Video Image Processing)&/p&&p&第27章 作为后处理效果的运动模糊(Motion Blur as a Post-Processing Effect)&/p&&p&第28章 实用景深后期处理(Practical Post-Process Depth of Field)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&四、第四本书《GPU Pro 1》&/b&&/h2&&figure&&img src=&https://pic1.zhimg.com/v2-dec93093b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&531& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&531& data-original=&https://pic1.zhimg.com/v2-dec93093b_r.jpg&&&/figure&&p&&br&&/p&&h2&4.1 第一部分 渲染技巧(Rendering Techniques)&/h2&&p&1. 结合高度混合的四叉树位移贴图(Quadtree Displacement Mapping with Height Blending)&/p&&p&2. 基于几何着色器的NPR效果(NPR Effects Using the Geometry Shader)&/p&&p&3. 作为后处理的alpha混合(Alpha Blending as a Post-Process)&/p&&p&4. 虚拟纹理映射101(Virtual Texture Mapping 101)&/p&&p&&br&&/p&&h2&4.2 第二部分 全局光照(Global Illumination)&/h2&&p&1. 用于间接光照的快速,基于模板的多分辨率泼溅(Fast, Stencil-Based Multiresolution Splatting for Indirect Illumination)&/p&&p&2. 屏幕空间定向遮蔽(Screen-Space Directional Occlusion) &/p&&p&3. 使用几何Impostors的实时多级光线追踪(Real-Time Multi-Bounce Ray-Tracing with Geometry Impostors)&/p&&p&&br&&/p&&h2&4.3 第三部分 图像空间(Image Space)&/h2&&p&1. GPU上的各项异性的Kuwahara滤波(Anisotropic Kuwahara Filtering on the GPU)&/p&&p&2. 边缘抗锯齿的后处理(Edge Anti-aliasing by Post-Processing)&/p&&p&3. 使用Floyd-Steinberg半色调的环境映射(Environment Mapping with Floyd-Steinberg&br&Halftoning)&/p&&p&4. 用于粒状遮挡剔除的分层项缓冲(Hierarchical Item Buffers for Granular Occlusion Culling)&/p&&p&5. 后期制作中的真实感景深(Realistic Depth of Field in Postproduction)&/p&&p&6. 实时屏幕空间的云层光照(Real-Time Screen Space Cloud Lighting)&/p&&p&7. 屏幕空间次表面散射(Screen-Space Subsurface Scattering)&/p&&p&&br&&/p&&h2&4.4 第四部分 阴影(Shadows) &/h2&&p&1. 快速常规阴影过滤(Fast Conventional Shadow Filtering)&/p&&p&2. 混合最小/最大基于平面的阴影贴图(Hybrid Min/Max Plane-Based Shadow Maps)&/p&&p&3: 利用四面体映射实现全向光的阴影映射(Shadow Mapping for Omnidirectional Light Using Tetrahedron Mapping)&/p&&p&4. 屏幕空间软阴影(Screen Space Soft Shadows &/p&&p&&br&&/p&&h2&4.5 第五部分 3D引擎设计(3D Engine Design)&/h2&&p&&br&&/p&&p&1. 基于桶排序的GPU多片段效果(Multi-Fragment Effects on the GPU Using Bucket Sort)&/p&&p&2.随着cell带宽引擎的并行光预通道渲染(Parallelized Light Pre-Pass Rendering with the Cell Broadband Engine)&/p&&p&3. 在Direct3D9和OpenGL 2之间移植代码(Porting Code between Direct3D9 and OpenGL 2.0)&/p&&p&4. DirectX 9实用线程渲染(Practical Thread Rendering for DirectX 9)&/p&&p&&br&&/p&&p&&br&&/p&&h2&4.6 第六部分 游戏解析(Game Postmortems) &/h2&&p&1. Spore中的风格化渲染(Stylized Rendering in Spore)&/p&&p&2: 《狂野西部:生死同盟》中的渲染技巧(Rendering Techniques in Call of Juarez: Bound in Blood )&/p&&p&3. 制作大型,漂亮、快速且流畅的游戏:经验教训(Making it Large, Beautiful, Fast, and Consistent: Lessons Learned)&/p&&p&4. 可破坏的体积地形(Destructible Volumetric Terrain)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&五、第五本书《GPU Pro 2》&/b&&/h2&&figure&&img src=&https://pic3.zhimg.com/v2-d6b636b6b5c6e1b892dc3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&510& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&510& data-original=&https://pic3.zhimg.com/v2-d6b636b6b5c6e1b892dc3_r.jpg&&&/figure&&p&&br&&/p&&h2&5.1 第一部分 几何操作(Geometry Manipulation)&/h2&&p&1. 使用硬件镶嵌的地形和海洋渲染(Terrain and Ocean Rendering with Hardware Tessellation)&/p&&p&2. 实际且真实的面部皱纹动画(Practical and Realistic Facial Wrinkles Animation)&/p&&p&3. GPU上的程序内容生成(Procedural Content Generation on the GPU)&/p&&p&&br&&/p&&p&&br&&/p&&h2&5.2 第二部分 渲染(Rendering)&/h2&&p&1. 预集成的皮肤着色(Pre-Integrated Skin Shading)&/p&&p&2. 使用延迟着色实现毛发(Implementing Fur Using Deferred Shading)&/p&&p&3. 户外游戏的大规模地形渲染(Large-Scale Terrain Rendering for Outdoor Games) &/p&&p&4. 实用形态学抗锯齿(Practical Morphological Antialiasing)&/p&&p&5. 体积贴花(Volume Decals)&/p&&p&&br&&/p&&p&&br&&/p&&h2&5.3 第三部分 全局光照效果(Global Illumination Effects)&/h2&&p&1. 时域屏幕空间环境光遮蔽(Temporal Screen-Space Ambient Occlusion)&/p&&p&2. 细节层次与流优化的辐照度法线映射(Level-of-Detail and Streaming Optimized Irradiance Normal Mapping)&/p&&p&3. 使用光线追踪的实时单次弹射间接光照与阴影(Real-Time One-Bounce Indirect Illumination and Shadows using Ray Tracing)&/p&&p&4. 半透明均匀介质中光传输的实时近似(Real-Time Approximation of Light Transport in Translucent Homogenous Media)&/p&&p&5. 基于时间相关光传播量的漫反射全局光照(Diffuse Global Illumination with Temporally Coherent Light Propagation Volumes)&/p&&p&&br&&/p&&p&&br&&/p&&h2&5.4 第四部分 Shadows 阴影 &/h2&&p&1. 减少方差阴影图光漏的技巧(Variance Shadow Maps Light-Bleeding Reduction Tricks)&/p&&p&2. 基于自适应阴影贴图的快速软阴影(Fast Soft Shadows via Adaptive Shadow Maps)&/p&&p&3. 自适应体积阴影贴图(Adaptive Volumetric Shadow Maps)&/p&&p&4. 具有时间相关性的快速软阴影(Fast Soft Shadows with Temporal Coherence)&/p&&p&5. Mip贴图屏幕空间软阴影(Mipmapped Screen-Space Soft Shadows)&/p&&p&&br&&/p&&h2&5.5 第五部分 手持设备(Handheld Devices)&/h2&&p&&br&&/p&&p&1. 一个基于Shader的电子书渲染器(A Shader-Based eBook Renderer)&/p&&p&2. 移动设备上的后处理特效(Post-Processing Effects on Mobile Devices)&/p&&p&3. 基于shader的水特效(Shader-Based Water Effects)&/p&&p&&br&&/p&&h2&5.6 第六部分 3D Engine Design (3D引擎设计)&/h2&&p&1. 对于游戏的实用动态可见性(Practical, Dynamic Visibility for Games)&/p&&p&2. 使用像素四元消息传递的着色器分摊(Shader Amortization using Pixel Quad Message Passing)&/p&&p&3. 用于实时群体的渲染流水线(A Rendering Pipeline for Real-Time Crowds)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&六、第六本书《GPU Pro 3》&/b&&/h2&&figure&&img src=&https://pic1.zhimg.com/v2-9fdfa3ae7ad6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&500& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic1.zhimg.com/v2-9fdfa3ae7ad6_r.jpg&&&/figure&&p&&br&&/p&&h2&6.1 第一部分 几何操作(Geometry Manipulation)&/h2&&p&1. 顶点着色器的镶嵌(Vertex Shader Tessellation)&/p&&p&2. 基于DirectX 11的实时变形地形渲染(Real-Time Deformable Terrain Rendering with DirectX 11)&/p&&p&3. 优化体育场的人群渲染(Optimized Stadium Crowd Rendering)&/p&&p&4. 几何抗锯齿方法(Geometric Antialiasing Methods)&/p&&p&&br&&/p&&h2&6.2 第二部分 渲染(Rendering)&/h2&&p&1. 基于GPU的实用椭圆纹理滤波(Practical Elliptical Texture Filtering on the GPU)&/p&&p&2. 对大气散射的Chapman掠入射函数近似(An Approximation to the Chapman Grazing-Incidence Function for Atmospheric Scattering)&/p&&p&3. 立体实时水与泡沫的渲染(Volumetric Real-Time Water and Foam Rendering)&/p&&p&4. CryENGINE 3:回顾近三年的工作(CryENGINE 3: Three Years of Work in Review)&/p&&p&5. 简单对象的廉价抗锯齿(Inexpensive Antialiasing of Simple Objects)&/p&&p&&br&&/p&&h2&6.3 第三部分 全局光照效果(Global Illumination Effects)&/h2&&p&1. 使用Oriented Splats网格的光线追踪近似反射(Ray-Traced Approximate Reflections&br&Using a Grid of Oriented Splats)&/p&&p&2. 屏幕空间弯曲锥体:一种实用的方法(Screen-Space Bent Cones: A Practical Approach)&/p&&p&3. 基于体素模型的实时近场全局照明(Real-Time Near-Field Global Illumination Based on a Voxel Model) &/p&&p&&br&&/p&&h2&6.4 第四部分 阴影(Shadows)&/h2&&p&1.对阴影贴图的高效在线可见性(Efficient Online Visibility for Shadow Maps)&/p&&p&2. 深度拒绝图案阴影(Depth Rejected Gobo Shadows) &/p&&p&&br&&/p&&h2&6.5 第五部分 3D引擎设计(3D Engine Design)&/h2&&p&1. Z3剔除(Z3 Culling)&/p&&p&2. 基于四元数的渲染流水线(A Quaternion-Based Rendering Pipeline)&/p&&p&3. 用DirectX 11实现定向自适应边缘AA滤波器(Implementing a Directionally Adaptive&br&Edge AA Filter Using DirectX 11)&/p&&p&4. 设计一个数据驱动的渲染器(Designing a Data-Driven Renderer)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&七、第七本书《GPU Pro 4》&/b&&/h2&&figure&&img src=&https://pic1.zhimg.com/v2-f9ccb9bcd4_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&525& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&525& data-original=&https://pic1.zhimg.com/v2-f9ccb9bcd4_r.jpg&&&/figure&&p&&br&&/p&&h2&7.1 第一部分 几何操作(Geometry Manipulation)&/h2&&p&1. GPU地形细分和镶嵌(GPU Terrain Subdivision and Tessellation)&/p&&p&2. 对可编程顶点Pulling渲染流水线的简介(Introducing the Programmable Vertex Pulling Rendering Pipeline)&/p&&p&3. WebGL全局渲染流水线(A WebGL Globe Rendering Pipeline)&/p&&p&&br&&/p&&h2&7.2 第二部分 渲染(Rendering)&/h2&&p&1. 使用Cubemaps和图像代理的实用平面反射(Practical Planar Reflections Using Cubemaps and Image Proxies)&/p&&p&2. 实时Ptex和矢量位移(Real-Time Ptex and Vector Displacement)&/p&&p&3. 在GPU上解耦延迟着色(Decoupled Deferred Shading on the GPU)&/p&&p&4. 分块前向着色(Tiled Forward Shading)&/p&&p&5. 实时渲染向电影式渲染的迈进(Forward+: A Step Toward Film-Style Shading in Real Time)&/p&&p&6. 渐进屏幕空间多通道表面体素化(Progressive Screen-Space Multichannel Surface Voxelization)&/p&&p&7. 基于体素的动态全局照明(Rasterized Voxel-Based Dynamic Global Illumination)&/p&&p&&br&&/p&&h2&7.3 第三部分 图像空间(Image Space)&/h2&&p&1. 《小龙斯派罗:交换力量》中的景深着色器(The Skylanders SWAP Force Depth-of-Field Shader)&/p&&p&2. 模拟后处理景深方法中的局部遮蔽(Simulating&br&Partial Occlusion in Post-Processing Depth-of-Field Methods)&/p&&p&3. 第二深度抗锯齿(Second-Depth Antialiasing)&/p&&p&4. 实用的帧缓冲压缩(Practical Framebuffer Compression)&/p&&p&5. 一致性 - 增强GPU上的过滤效果(Coherence-Enhancing Filtering on&br&the GPU)&/p&&p&&br&&/p&&h2&7.4 第四部分 阴影(Shadows)&/h2&&p&1. 实时深度阴影贴图(Real-Time Deep Shadow Maps)&/p&&p&&br&&/p&&h2&7.5 第五部分 游戏引擎设计(Game Engine Design)&/h2&&p&&br&&/p&&p&1. 基于方向的引擎架构(An Aspect-Based Engine Architecture)&/p&&p&2. 使用Direct3D 11进行Kinect编程(Kinect Programming with Direct3D 11)&/p&&p&3. 一个对Authored Structural Damage的管线(A Pipeline for Authored Structural&br&Damage)&/p&&p&&br&&/p&&h2&&b&八、第八本书《GPU Pro 5》&/b&&/h2&&figure&&img src=&https://pic2.zhimg.com/v2-93ef0b8fa61ad4ed9bf94_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&527& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&527& data-original=&https://pic2.zhimg.com/v2-93ef0b8fa61ad4ed9bf94_r.jpg&&&/figure&&p&&br&&/p&&h2&8.1 第一部分 渲染(Rendering)&/h2&&p&1. 对单通道A缓冲的每像素列表(Per-Pixel Lists for Single Pass A-Buffer)&/p&&p&2. 使用双通道颜色编码减少纹理内存使用(Reducing Texture Memory Usage by 2-Channel Color Encoding)&/p&&p&3. 基于粒子的老化材质模拟(Particle-Based Simulation of Material Aging)&/p&&p&4. 简单的基于光栅化的液体(Simple Rasterization-Based Liquids)&/p&&p&&br&&/p&&h2&8.2 第二部分 光照与着色(Lighting and Shading)&/h2&&p&1. 基于物理的区域光照(Physically Based Area Lights)&/p&&p&2. 利用极线采样的高性能室外光照散射(High Performance Outdoor Light Scattering Using Epipolar Sampling)&/p&&p&3.《杀戮地带》中的体积光效果:Shadow Fall(Volumetric Light Effects in Killzone: Shadow Fall)&/p&&p&4. 层次-Z 屏幕空间锥追踪反射(Hi-Z Screen-Space Cone-Traced Reflections)&/p&&p&5. TressFX:先进的实时毛发渲染(TressFX: Advanced Real-Time Hair Rendering)&/p&&p&6. 线的抗锯齿(Wire Antialiasing)&/p&&p&&br&&/p&&h2&8.3 第三部分 图像空间(Image Space)&/h2&&p&1. 屏幕空间的草地(Screen-Space Grass)&/p&&p&2. 基于每像素链表构造实体几何的屏幕空间可变形网格(Screen-Space Deformable Meshes via CSG with Per-Pixel Linked Lists)&/p&&p&3. SPU上的背景虚化效果(Bokeh Effects on the SPU)&/p&&p&&br&&/p&&h2&8.4 第四部分 移动设备(Mobile Devices)&/h2&&p&1. 手机上的真实感实时皮肤渲染(Realistic Real-Time Skin Rendering on Mobile)&/p&&p&2. 移动设备上的延迟渲染技术(Deferred Rendering Techniques on Mobile Devices)&/p&&p&3. 使用ARM(R) Mali(TM) GPUs的带宽高效图形渲染(Bandwidth Efficient Graphics with ARM(R) Mali(TM) GPUs)&/p&&p&4. 使用OpenGL ES 3.0的高效目标变形动画(Efficient Morph Target Animation Using OpenGL ES 3.0)&/p&&p&5. 分块延迟模糊(Tiled Deferred Blending)&/p&&p&6. 自适应可伸缩纹理压缩(Adaptive Scalable Texture Compression)&/p&&p&7. 针对ARM(R) Mali(TM)-T600 GPU的OpenCL内核优化(Optimizing OpenCL Kernels for the ARM(R) Mali(TM)-T600 GPUs)&/p&&p&&br&&/p&&h2&8.5 第五部分 3D引擎设计(3D Engine Design)&/h2&&p&1. 重新认识四元数(Quaternions Revisited)&/p&&p&2. glTF : 设计一个开放标准的运行时资源格式(glTF: Designing an Open-Standard Runtime Asset Format)&/p&&p&3. 管理Hierarchy中的变换(Managing Transformations in Hierarchy)&/p&&p&&br&&/p&&h2&8.6 第六部分 计算(Compute)&/h2&&p&1. TressFX中的头发模拟(Hair Simulation in TressFX)&/p&&p&2. 对全动态场景的对象次序光线追踪(Object-Order Ray Tracing for Fully Dynamic Scenes)&/p&&p&3. GPU上的四叉树(Quadtrees on the GPU)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&九、第九本书《GPU Pro 6》&/b&&/h2&&figure&&img src=&https://pic1.zhimg.com/v2-f629c12ea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&480& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&480& data-original=&https://pic1.zhimg.com/v2-f629c12ea_r.jpg&&&/figure&&p&&br&&/p&&h2&9.1 第一部分 几何操作(Geometry Manipulation)&/h2&&p&1. 动态GPU地形(Dynamic GPU Terrain)&/p&&p&2. 在GPU上通过镶嵌的带宽高效程序化网格(Bandwidth-Efficient Procedural Meshes in the GPU via Tessellation)&/p&&p&3. 物体碰撞时细分表面的实时形变(Real-Time Deformation of Subdivision Surfaces on Object Collisions)&/p&&p&4.
游戏中的逼真体积爆炸(Realistic Volumetric Explosions in Games)&/p&&p&&br&&/p&&h2&9.2 第二部分 渲染(Rendering)&/h2&&p&1. 《神偷》中的下一代渲染技术(Next-Generation Rendering in Thief)&/p&&p&2. 草地渲染和使用LOD的模拟(Grass Rendering and Simulation with LOD)&/p&&p&3. 混合重建抗锯齿(Hybrid Reconstruction Antialiasing)&/p&&p&4. 使用预计算散射的基于物理的云层实时渲染(Real-Time Rendering of Physically Based Clouds Using Precomputed Scattering)&/p&&p&5. 稀疏程序化体渲染(Sparse Procedural Volume Rendering)&/p&&p&&br&&/p&&h2&9.3 第三部分 光照(Lighting)&/h2&&p&1. 使用光照链表的实时光照(Real-Time Lighting via Light Linked List)&/p&&p&2. 延迟归一化的辐照度探针(Deferred Normalized Irradiance Probes)&/p&&p&3. 体积雾与光照(Volumetric Fog and Lighting)&/p&&p&4. GPU上基于物理的光照探针(Physically Based Light Probe Generation on GPU) &/p&&p&5. 使用薄片的实时全局光照(Real-Time Global Illumination Using Slices)&/p&&p&&br&&/p&&p&&br&&/p&&h2&9.4 第四部分 阴影(Shadows)&/h2&&p&1. 实用屏幕空间软阴影(Practical Screen-Space Soft Shadows)&/p&&p&2. 基于分块的全方位阴影(Tile-Based Omnidirectional Shadows)&/p&&p&3. 阴影贴图轮廓的重新矢量化(Shadow Map Silhouette Revectorization)&/p&&p&&br&&/p&&p&&br&&/p&&h2&9.5 第五部分 移动设备(Mobile Devices)&/h2&&p&1. PowerVR GPU上的混合光线追踪(Hybrid Ray Tracing on a PowerVR GPU)&/p&&p&2. 实现一个仅有GPU的粒子碰撞系统,使用自适应可伸缩纹理压缩3D纹理和OpenGL ES 3.0(Implementing a GPU-Only Particle-Collision System with ASTC 3D Textures and OpenGL ES 3.0)&/p&&p&3. 针对移动设备的动画角色毛皮(Animated Characters with Shell Fur for Mobile Devices)&/p&&p&4. 移动GPU的高动态范围计算摄影(High Dynamic Range Computational Photography on Mobile GPUs)&/p&&p&&br&&/p&&h2&9.6 第六部分 计算(Compute)&/h2&&p&1. 基于计算的分块剔除(Compute-Based Tiled Culling)&/p&&p&2. 在GPU光线追踪器上渲染矢量位移映射表面(Rendering Vector Displacement-Mapped Surfaces in a GPU Ray Tracer)&/p&&p&3. 对体渲染的平滑概率环境光遮蔽(Smooth&br&Probabilistic Ambient Occlusion for Volume Rendering)&/p&&p&&br&&/p&&h2&9.7 第七部分 3D引擎设计(3D Engine Design)&/h2&&p&1. 用于快速光线投射操作的分块线性二元方格(Block-Wise Linear Binary Grids for Fast Ray-Casting Operations)&/p&&p&2. 采用Shader Shaker基的于语义的着色器生成(Semantic-Based Shader Generation Using Shader Shaker)&/p&&p&3. ANGL: 将OpenGL ES引入桌面端(ANGLE: Bringing OpenGL ES to the Desktop)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&十、第十本书《GPU Pro 7》&/b&&/h2&&figure&&img src=&https://pic1.zhimg.com/v2-cc232d2af89afb3ae38da775_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&507& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&507& data-original=&https://pic1.zhimg.com/v2-cc232d2af89afb3ae38da775_r.jpg&&&/figure&&p&&br&&/p&&h2&10.1 第一部分 几何操作(Geometry Manipulation)&/h2&&p&1.《古墓丽影:崛起》中的延迟雪地形变(Deferred Snow Deformation in Rise of the Tomb Raider)&/p&&p&2. Catmull Clark细分曲面(Catmull-Clark Subdivision Surfaces)&/p&&p&&br&&/p&&h2&10.2 第二部分 光照(Lighting)&/h2&&p&1. 集群着色:使用DirectX12中的保守光栅化指定光照(Clustered Shading: Assigning Lights Using Conservative Rasterization in DirectX 12)&/p&&p&2. 精细删减的分块光照列表(Fine Pruned Tiled Light Lists)&/p&&p&3. 延迟属性插值着色(Deferred Attribute Interpolation Shading)&/p&&p&4. 实时的体积云朵景观(Real-Time Volumetric Cloudscapes)&/p&&p&&br&&/p&&h2&10.3 第三部分 渲染(Rendering)&/h2&&p&1. 自适应虚拟纹理(Adaptive Virtual Textures)&/p&&p&2. 延迟粗像素着色(Deferred Coarse Pixel Shading)&/p&&p&3. 使用多帧采样进行渲染(Progressive Rendering Using Multi-frame Sampling)&/p&&p&&br&&/p&&p&&br&&/p&&h2&10.4 第四部分 移动设备(Mobile Devices)&/h2&&p&1. 基于静态局部立方体贴图的高效软阴影(Efficient Soft Shadows Based on Static Local Cubemap)&/p&&p&2. 移动平台上基于物理的延迟着色(Physically Based Deferred Shading on Mobile)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&十一、第十一本书《GPU Zen》&/b&&/h2&&figure&&img src=&https://pic1.zhimg.com/v2-366cdf5edde_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&549& data-rawheight=&648& class=&origin_image zh-lightbox-thumb& width=&549& data-original=&https://pic1.zhimg.com/v2-366cdf5edde_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&h2&11.1 第一部分 几何操作(Geometry Manipulation)&/h2&&p&1. 属性顶点云层(Attributed Vertex Clouds)&/p&&p&2. 使用内保守光栅化渲染凸面遮挡物(Rendering Convex Occluders with Inner Conservative Rasterization)&/p&&p&&br&&/p&&h2&11.2 第二部分 光照(Lighting)&/h2&&p&1. 稳定的间接光照(Stable Indirect Illumination)&/p&&p&2. 使用膨化体积光的参与性介质(Participating Media Using Extruded Light Volumes)&/p&&p&&br&&/p&&h2&11.3 第三部分 渲染(Rendering)&/h2&&p&1. Deferred+ : 针对Dawn引擎的下一代剔除和渲染(Deferred+: Next-Gen Culling and Rendering for the Dawn Engine)&/p&&p&2. 使用保守光栅化的可编程每像素采样放置(Programmable Per-pixel Sample Placement with Conservative Rasterizer)&/p&&p&3. 手机卡通渲染(Mobile Toon Shading)&/p&&p&4. 高质量高效GPU图像细节处理(High Quality GPU-efficient Image Detail Manipulation)&/p&&p&5. 使用线性变换余弦的线性光着色(Linear-Light Shading with Linearly Transformed Cosines)&/p&&p&&br&&/p&&h2&11.4 第四部分 屏幕空间(Screen Space)&/h2&&p&1.可扩展的自适应屏幕空间环境光遮蔽(Scalable Adaptive SSAO)&/p&&p&2.在PS4上达到1ms 1080p的鲁棒性屏幕空间环境光遮蔽(Robust Screen Space&br&Ambient Occlusion in 1 ms in 1080p on PS4)&/p&&p&3.基于实际采集的散景(Practical Gather-based Bokeh)&/p&&p&&br&&/p&&p&&br&&/p&&h2&&b&结语&/b&&/h2&&p&&br&&/p&&p&可以发现,仅“GPU精粹三部曲”目录式的200+核心章节名称的列举,都已有几千字之多,可谓内容丰富,干货无数。&/p&&p&&br&&/p&&p&希望透过这“GPU精粹三部曲”的11本书,透过这个新的系列文章,不仅能让我们的图形学技术和实时渲染技术再上一个台阶,也能站在巨人的肩膀上,管中窥豹,品味这10多年间,实时渲染与游戏开发领域的蜕变。&/p&&p&&br&&/p&&p&希望自己能将“GPU精粹三部曲”这游戏开发、图形学和渲染领域进阶知识的饕餮盛宴,总结得出色。&/p&&p&&br&&/p&&p&同时也希望这个新的系列文章,能对热爱游戏开发,图形学和渲染的各位朋友们有所帮助。&/p&&p&&br&&/p&&p&最后,放出“GPU精粹三部曲”的全家福,结束这篇文章。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ddc2625b3afd2092711e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&2268& data-rawheight=&2401& class=&origin_image zh-lightbox-thumb& width=&2268& data-original=&https://pic2.zhimg.com/v2-ddc2625b3afd2092711e_r.jpg&&&/figure&&p&&br&&/p&&p&下篇文章,《GPU Gems 1》全书核心内容提炼总结,再见。&/p&&p&&br&&/p&&p&With best wishes.&/p&&p&&/p&
系列文章前言 《GPU Gems》1~3 、《GPU Pro》1~7 以及《GEM Zen》组成的GPU精粹系列书籍,是游戏开发、计算机图形学和渲染领域的业界大牛们优秀经验的分享合辑汇编,是江湖各大武林门派绝学经典招式的精华荟萃,可谓游戏开发、图形学和渲染领域进阶知识精彩…
确实是可以用 Shader 实现的,关键词:&b&卡通渲染(Cartoon Render)&/b&。&br&&br&一言以蔽之,卡通渲染可以简单地理解为「减少模型的颜色层级,并增加描边」。&br&《Manifold Garden》中并没有采用前半段(本身模型颜色单一),而主要是添加粗细均匀的描线。&br&&br&&figure&&img src=&https://pic4.zhimg.com/0f_b.png& data-rawwidth=&694& data-rawheight=&456& class=&origin_image zh-lightbox-thumb& width=&694& data-original=&https://pic4.zhimg.com/0f_r.png&&&/figure&&br&这里简单粗暴地上一种最基础的实现方法(以 Unity 为例):&br&&br&1. 在项目中新建一个 Shader;&br&2. 复制本段 shader 内容粘贴覆盖:&br&&div class=&highlight&&&pre&&code class=&language-csharp&&&span class=&n&&Shader&/span& &span class=&s&&&Custom/ToonShader&&/span& &span class=&p&&{&/span&
&span class=&n&&Properties&/span& &span class=&p&&{&/span&
&span class=&n&&_Color&/span&&span class=&p&&(&/span&&span class=&s&&&Main Color&&/span&&span class=&p&&,&/span&&span class=&n&&color&/span&&span class=&p&&)=(&/span&&span class=&m&&1&/span&&span class=&p&&,&/span&&span class=&m&&1&/span&&span class=&p&&,&/span&&span class=&m&&1&/span&&span class=&p&&,&/span&&span class=&m&&1&/span&&span class=&p&&)&/span&&span class=&c1&&//物体的颜色&/span&
&span class=&n&&_Outline&/span&&span class=&p&&(&/span&&span class=&s&&&Thick of Outline&&/span&&span class=&p&&,&/span&&span class=&n&&range&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span&&span class=&m&&0.1&/span&&span class=&p&&))=&/span&&span class=&m&&0.02&/span&&span class=&c1&&//挤出描边的粗细&/span&
&span class=&n&&_Factor&/span&&span class=&p&&(&/span&&span class=&s&&&Factor&&/span&&span class=&p&&,&/span&&span class=&n&&range&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span&&span class=&m&&1&/span&&span class=&p&&))=&/span&&span class=&m&&0.5&/span&&span class=&c1&&//挤出多远&/span&
&span class=&n&&_ToonEffect&/span&&span class=&p&&(&/span&&span class=&s&&&Toon Effect&&/span&&span class=&p&&,&/span&&span class=&n&&range&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span&&span class=&m&&1&/span&&span class=&p&&))=&/span&&span class=&m&&0.5&/span&&span class=&c1&&//卡通化程度(二次元与三次元的交界线)&/span&
&span class=&n&&_Steps&/span&&span class=&p&&(&/span&&span class=&s&&&Steps of toon&&/span&&span class=&p&&,&/span&&span class=&n&&range&/span&&span class=&p&&(&/span&&span class=&m&&0&/span&&span class=&p&&,&/span&&span class=&m&&9&/span&&span class=&p&&))=&/span&&span class=&m&&3&/span&&span class=&c1&&//色阶层数&/span&
&span class=&p&&}&/span&
&span class=&n&&SubShader&/span& &span class=&p&&{&/span&
&span class=&n&&pass&/span&&span class=&p&&{&/span&&span class=&c1&&//处理光照前的pass渲染&/span&
&span class=&n&&Tags&/span&&span class=&p&&{&/span&&span class=&s&&&LightMode&&/span&&span class=&p&&=&/span&&span class=&s&&&Always&&/span&&span class=&p&&}&/span&
&span class=&n&&Cull&/span& &span class=&n&&Front&/span&
&span class=&n&&ZWrite&/span& &span class=&n&&On&/span&
&span class=&n&&CGPROGRAM&/span&
&span class=&cp&&#pragma vertex vert&/span&
&span class=&cp&&#pragma fragment frag&/span&
&span class=&err&&#&/span&&span class=&n&&include&/span& &span class=&s&&&UnityCG.cginc&&/span&
&span class=&kt&&float&/span& &span class=&n&&_Outline&/span&&span class=&p&&;&/span&
&span class=&kt&&float&/span& &span class=&n&&_Factor&/span&&span class=&p&&;&/span&
&span class=&k&&struct&/span& &span class=&nc&&v2f&/span& &span class=&p&&{&/span&
&span class=&n&&float4&/span& &span class=&n&&pos&/span&&span class=&p&&:&/span&&span class=&n&&SV_POSITION&/span&&span class=&p&&;&/span&
&span class=&p&&};&/span&
&span class=&n&&v2f&/span& &span class=&nf&&vert&/span& &span class=&p&&(&/span&&span class=&n&&appdata_full&/span& &span class=&n&&v&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&v2f&/span& &span class=&n&&o&/span&&span class=&p&&;&/span&
&span class=&n&&float3&/span& &span class=&n&&dir&/span&&span class=&p&&=&/span&&span class=&n&&normalize&/span&&span class=&p&&(&/span&&span class=&n&&v&/span&&span class=&p&&.&/span&&span class=&n&&vertex&/span&&span class=&p&&.&/span&&span class=&n&&xyz&/span&&span class=&p&&);&/span&
&span class=&n&&float3&/span& &span class=&n&&dir2&/span&&span class=&p&&=&/span&&span class=&n&&v&/span&&span class=&p&&.&/span&&span class=&n&&normal&/span&&span class=&p&&;&/span&
&span class=&kt&&float&/span& &span class=&n&&D&/span&&span class=&p&&=&/span&&span class=&n&&dot&/span&&span class=&p&&(&/span&&span class=&n&&dir&/span&&span class=&p&&,&/span&&span class=&n&&dir2&/span&&span class=&p&&);&/span&
&span class=&n&&dir&/span&&span class=&p&&=&/span&&span class=&n&&dir&/span&&span class=&p&&*&/span&&span class=&n&&sign&/span&&span class=&p&&(&/span&&span class=&n&&D&/span&&span class=&p&&);&/span&
&span

我要回帖

更多关于 大挂武林 的文章

 

随机推荐