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

最近时间多了起来,准备捡起扔下了的渲染部分的知识。想拜读下GPU Pro系列并且做个笔记,不知道自己能否坚持下来,但愿可以吧。自己能力也有限,写的东西也只是自己的理解,肯定有很多理解不到位甚至错误的地方,也希望如果哪位大神看到了可以指正。关于tessellation,这篇博客介绍的很好https://blog.csdn.net/weixin_43675955/article/details/85005229

如果想让场景更真实,你可能需要细节更高,面数更多的模型,但是这样会使得cpu计算增加,运行变慢。

The best solution for tessellation is the recently developed tessellator stage in DirectX 11. This stage, together with the hull and the domain shader, allows the programmer to tessellate very quickly into the GPU. With this method you can send low-level detail meshes to the GPU and generate the missing geometry to the GPU depending on the camera distance, angle, or whatever you want. 

Tessellation(细分曲面)技术是将低模细节度低的模型输入至gpu中,在DirectX11之后,在hull 和 domain shader中可以通过tessellation快速的增加细节来增强表现力,却又不需要损耗cpu的性能。

 

 

通过DirectX 11中的渲染流水线可以看出,在Vertex Shader和 Geometry Shader之间插入了 Hull Shader Stage ,Tessellator Stage 和 Domain Shader Stage三个阶段,用于处理Tessellation。

Hull Shader Stage

Hull shader 的 输入比较特殊,叫做 contral point patch list。常规情况下,vertex shader的输出是顶点, 但是如果要用硬件曲面细分,那么顶点着色器输出就不再是顶点,而是control point的patch,一个patch包含多个control point,最多可以包含32个。vertex shader输出patch给HS用。

Hull shader 的输出包含两部分,一部分是control points(可以在Hull shader阶段进行修改),另一部分是一些常量,用于后续的tessellator stage 和 domain shader stage。为了计算这两部分输出,在该阶段需要有两个函数。

第一个函数叫做Constant Hull Shader,这个函数executed for every patch,也就是以patch为单位执行,在这个函数里,设置了tessellation的一些参数。

由示例代码可以看出,该函数的输入InputPatch是一个模板类,对应的是顶点着色器的输出,如果这里要用曲面细分的话,就不能在VS中乘以世界和摄像机投影矩阵(这是因为在tessellation中新加入了细节,新生成了顶点,如果在vertex shader中就做完了这些操作,新生成的顶点咋办呐),而是要留到细分结束后再变换(如果有几何着色器的话就留到几何着色器阶段再变换)。然后这里可以用SV_PrimitiveID获取Primitive的id。这里可以把细分等级和离摄像机的远近、屏幕覆盖范围、朝向、粗糙度等挂钩,而不是写一个定的值,可以起到优化的效果。

该函数的输出有两个值,分别为SV_TessFactor和SV_InsideTessFactor,前者是边的细分等级,后者是面片中心的细分等级。前者有几条边就要输出几个,分别对应每条边的参数,后者则要输出两个,分别对应的是u和v方向。

struct PatchTess
{
float EdgeTess[4] : SV_TessFactor;
float InsideTess[2] : SV_InsideTessFactor;
// Additional info you want associated per patch.
};
PatchTess ConstantHS(InputPatch<VertexOut, 4> patch,
uint patchID : SV_PrimitiveID)
{
PatchTess pt;
// Uniformly tessellate the patch 3 times.
pt.EdgeTess[0] = 3; // Left edge
pt.EdgeTess[1] = 3; // Top edge
pt.EdgeTess[2] = 3; // Right edge
pt.EdgeTess[3] = 3; // Bottom edge
pt.InsideTess[0] = 3; // u-axis (columns)
pt.InsideTess[1] = 3; // v-axis (rows)
return pt;
}

第二个函数叫做Control Point Hull Shader,这个部分是每个control point都调用一次,因此和顶点着色器类似,只不过对象是control point,在这个阶段我们可以改变曲面的表达形式,比如把输入的三角面(三个control point)变成由包含十个control point的patch控制的贝塞尔曲线输出,等等。
Control Point HS要定义不少属性,其中domain是patch type,可选的有tri,quad或者isoline。
partitioining是细分模式,integer的细分等级会突变,而fractional_odd或者fractional_even的细分等级会渐变,顶点会逐渐移动直到消失,而不会突然pop出来或者消失。
outputtopology输出的三角面的winding order,有triangle_cw,triangle_ccw,line这三个选项
outputcontrolpoints是输出顶点的数量,也就是hs的执行次数,可以用SV_OutputControlPointID获取当前Control Point的ID。
patchconstantfunc则是constantHS的名字
maxtessfactor是最大细分数量,dx11最高支持到64,这里可以手动设置得更低。
 

struct HullOut
{float3 PosL : POSITION;
};
[domain(“quad”)]
[partitioning(“integer”)]
[outputtopology(“triangle_cw”)]
[outputcontrolpoints(4)]
[patchconstantfunc(“ConstantHS”)]
[maxtessfactor(64.0f)]
HullOut HS(InputPatch<VertexOut, 4> p,
uint i : SV_OutputControlPointID,
uint patchId : SV_PrimitiveID)
{HullOut hout;hout.PosL = p[i].PosL;return hout;
}

The Tessellation Stage

Hull shader结束之后就是细分阶段,该阶段由硬件完成,不可编程,通过Hull shader中设置的参数,该阶段会新生成顶点,但是得出的只是顶点的uv,实际的位置等信息是在之后的domain shadr中进行计算。

在这里,可以理解下之前设置的参数,SV_TessFactor和SV_InsideTessFactor。

对于四边形图元,边的顺序是左上右下顺时针。如下图中的第一个图:每个边的参数都为4,也就是说每个边等分成了四份。中心的参数为(4,4),也就是中心也等分成了4份。

再如下图中的第三个图:左边和上边参数为2,则二等分,右边和下边为4则是4等分。中心参数为2和4,分别对应u方向和v方向,所以中心部分横向(u方向)二等分,纵向(v方向)四等分。

对于三角形图元,细分操作同,只不过中心参数只有一个,中心的操作是在每个三角形定点到中心的延长线方向进行。

Domain Shader Stage

In the domain shader we have to reconstruct every final vertex and we have to calculate the position, normal, and texture coordinates. This is the part where the difference between terrain and ocean rendering is more important.

该阶段的输入是细分好了的曲面,在该阶段我们要做的是根据uv来算出顶点的位置,法线和真正的纹理坐标。然后如果没有几何着色器的话,我们需要在这个阶段把顶点变换到屏幕坐标里。
这里说的给定uv是针对四边面,如果用的是三个control point的patch,那么这里给定的是质心坐标系下的uvw。

Terrain&Ocean

说实话,后边这些没有太看懂。。还望各位大佬指导,大体总结几个点吧:

1.对于tessellation新生成的顶点,x和z方向的坐标可以通过patch中已有顶点的位置用插值方式得到。对于Terrain,y方向的坐标可以通过高度图和法线图得到已有顶点的高度参数后进行插值,对于Ocean,y坐标可以通过波浪函数计算得到。

2.很重要的一点是使用一些技术来计算tessellation factor,也就是tessellation的参数。比如对于某条边,它必然属于两个patch,要确保在这两个patch中该边的参数一致。再比如通过mipmap参数计算tessellation参数,距离摄像机越近的,tessellation参数越大,距离摄像机越远的地方,tessellation参数越小。

 

 


 

 

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

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

相关文章

GPU Pro2 - 3.Procedural Content Generation on the GPU

GPU Pro2 - 3.Procedural Content Generation on the GPU 这篇文章着重介绍了基于Brownian 噪声和高度图在GPU中实时生成和渲染无限大地形系统。 Procedural content generation (PCG)程序化生成在许多游戏中已经有广泛应用&#xff0c;从简单的随机物体摆放&#xff0c;到全…

GPU Gems1 - 1 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)

该读书笔记大多内容参照了大神浅墨的该篇文章https://zhuanlan.zhihu.com/p/35974789 本章介绍了一种在GPU中模拟和渲染大的水体的系统。它把基本网格的集合波动于动态发现贴图的生成结合起来。 1.1 目标和范围 这章里&#xff0c;我们将由计算简单正弦函数之和开始&#xf…

GPU Gems1 - 2 水刻蚀的渲染

2.1 引言 光线从弯曲的表面反射或折射&#xff0c;因此只聚焦在受光面上的某些区域&#xff0c;于是就产生了刻蚀现象。本文从美学角度出发&#xff0c;不以纯物理的方式计算&#xff0c;使其很容易在大多数图形硬件上实现&#xff0c;效果又十分逼真。 2.2 刻蚀的计算 如果想…

邮箱服务器ip地址白名单,申请SSL证书时如何设置IP地址白名单和邮箱白名单

8月3日消息 在申请SSL证书时&#xff0c;由于您的邮箱可能默认设置或自定义设置了拦截国外邮件&#xff0c;可能会导致您接收不到CA的邮件&#xff0c;给验证、收取证书带来了不便&#xff1b;如果服务器&#xff0c;防火墙也设置了拦截操作&#xff0c;那么即使您按CA要求完成…

GPU Gems1 - 3 Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)

该篇文章参照浅墨的这篇文章&#xff1a;https://zhuanlan.zhihu.com/p/35974789 Dawn是由NVIDIA创建的&#xff0c;用来介绍GeForce FX产品线的演示程序&#xff0c;它说明如何使用可编程的着色技术创建出逼真的人类角色。 最初的Dawn Demo由NVIDIA于2002年发布&#xff0c;…

GPU Gems1 - 5 改良的Perlin噪声的实现

Perlin 噪声 KenPerlin(1985a,2002)KenPerlin(1985a,2002) 定义的噪声函数是最常用的噪声函数&#xff0c;称为 Perlin 噪声。PerlinPerlin 噪声在全部 (x,y,z)(x,y,z) 整形顶点处的参数值都为 00&#xff0c;变化源自各顶点间的梯度向量&#xff0c;然后再进行平滑插值。 计算…

GPU Gems1 - 7 无数波动草叶的渲染

本文部分参照该文章https://zhuanlan.zhihu.com/p/35974789 1.引言 本章介绍了一种灵活的&#xff0c;广泛应用的草模拟。该方案渲染的草不仅生长得自然&#xff0c;也能够逼真地在风中舞动&#xff0c;而且性能很高。 2.概述 首先&#xff0c;需要意识到&#xff0c;对单个…

2003文件服务器迁移2016,服务器2016设置文件共享

服务器2016设置文件共享 内容精选换一换为了保证使用生成的镜像创建的新云服务器可以实现一键式重置密码功能&#xff0c;建议您安装密码重置插件CloudResetPwdAgent&#xff0c;可以应用一键式重置密码功能&#xff0c;给云服务器设置新密码。下载一键式重置密码插件CloudRese…

GPU Gems1 - 8 衍射的模拟

1.什么是衍射 小尺度的表面细节引起反射波彼此干扰&#xff0c;这个现象就是衍射。首先&#xff0c;计算机绘图的大多数表面反射模型都忽略自然光的波动效果。当表面的细节比光的波长&#xff08;约1um&#xff09;大许多时&#xff0c;不存在问题。但对于小尺寸的细节&#x…

GPU Gems1 - 9 有效的阴影体渲染

这章全面讲述了用于实时阴影渲染中常见两种流派之一的阴影体&#xff08;Shadow Volumes&#xff09;技术&#xff0c;又称模板阴影&#xff08;Stencil Shadows&#xff09;技术&#xff0c;重点是得到正确的角度的情形&#xff0c;减少几何图形和填充率的消耗。 简单谈谈阴影…

GPU Gems1 - 10 电影级的光照

本章中介绍了一个的简化的uberlight&#xff08;可理解为“全能光照”&#xff09;实现&#xff0c;此光照shader根据Ronen Barzel(1997,1999)提出的照明模型编写而成。而该模型的超集已由Pixar动画开发&#xff0c;并应用于《玩具总动员》、《怪物公司》、《海底总动员》等一系…

GPU Gems1 - 11 阴影贴图反走样

这章介绍了如何通过邻近百分比过滤方法&#xff08;Percentage-Closer Filtering , PCF&#xff09;有效减少阴影贴图的反走样&#xff0c;并描述了如何实现一个简化版本&#xff0c;并对PCF方法进行了一定改进。关于阴影贴图和PCF技术的一些链接 https://pubweb.eng.utah.edu…

GPU Gems1 - 12 全方位的阴影映射

在这章中&#xff0c;把阴影贴图的思路扩展到正确处理全方位的&#xff08;点&#xff09;光源中&#xff0c;其中包括了实现细节&#xff0c;也涉及到基本硬件能力不足时的低效运行策略。 首先&#xff0c;这篇文章也谈到了在实时计算机图形学中产生可见阴影的两个流行方法是…

GPU Gems1 - 13 使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)

这章介绍了一种渲染软阴影的技术&#xff0c;称为遮挡区间映射&#xff08;Occlusion Interval Maps&#xff09;&#xff0c;能够正确地在静态场景中渲染出光源沿着预定路径移动时产生的模糊阴影。之所以叫遮挡区间映射&#xff0c;是因为此算法使用纹理贴图来存储这种光源可见…

粗糙表面的微表面模型——Physically Based Material

关于文章 Microfacet Models for Refraction through Rough Sufaces的一点笔记&#xff0c;欢迎指正。 BSDF BSDF(Bidirectional Sacttering Distribution Function) 描述了光如何在物体表面散射。如果仅仅限制反射或者透射&#xff0c;BSDF经常被称作BRDF或者BTDF,然而BSDF将…

GPU Gems1 - 14 透视阴影贴图(Perspective Shadow Maps: Care and Feeding)

开篇先说&#xff0c;这文章好难懂啊&#xff0c;到现在也没完全弄明白&#xff0c;有大佬的话欢迎指点。这篇大体意思是对Perspective Shadow Maps进行部分优化。GEMS这书这点是真挺蛋疼&#xff0c;很多文章都是对某项技术的优化&#xff0c;那先介绍介绍原来技术嘛&#xff…

GPU Gems1 - 15 逐像素光照的可见性管理

这章讲到了可见性在逐像素渲染光照场景中的作用&#xff0c;也考虑如何使用可见性减少必须渲染的批次数量&#xff0c;从而改善性能。 假设一个非常简单的场景&#xff0c;一个房间&#xff0c;因为房间的不同部位是不同的材质&#xff0c;所以将其分为8个batch&#xff0c;另…

重建世界坐标

1.概论 在屏幕空间做一些操作的时候往往需要从屏幕坐标和深度纹理中重建出相应的世界坐标。 本文会讨论两种重建世界坐标的方法&#xff0c;并详细讲解第二种方法。 使用VP逆矩阵CameraPosInWorld linearDepth * Direction 2.使用VP逆矩阵法 我们知道屏幕坐标是通过Object…

GPU Gems1 - 16 次表面散射的实时近似(Real-Time Approximations to Subsurface Scattering)

这一章&#xff0c;浅墨这篇文章介绍的非常详细&#xff0c;我照扒一遍再稍加一些内容&#xff0c;增加记忆。https://zhuanlan.zhihu.com/p/36499291 【章节概览】 次表面散射&#xff08;Subsurface Scattering&#xff09;&#xff0c;简称SSS&#xff0c;或3S&#xff0c…

Unity HDRP渲染管线基础指南

HDRP和LWRP简介 Unity2018中引入了可编程渲染管线&#xff08;Scriptable Render Pipeline&#xff0c;简称SRP&#xff09;&#xff0c;是一种在Unity中通过C#脚本配置和执行渲染的方式。至2018.1版本&#xff0c;Unity中除了默认渲染管线&#xff0c;还提供了轻量级渲染管线…