TA工具箱首页 / TA 术语百科

曲面细分

2026-08-27

什么是曲面细分

曲面细分(Tessellation)是DirectX 11和OpenGL 4.0引入的可编程渲染管线阶段,它允许GPU根据特定规则(如距离、曲率等)动态地将粗糙的网格细分为更细小的三角形,从而在不增加初始模型数据量的情况下,实时提升几何细节。这一技术使得平滑曲面、复杂位移和自适应细节层次(LOD)成为可能。

渲染管线中的位置

曲面细分位于顶点着色器之后、几何着色器之前。它包含三个可选阶段:

  • **外壳着色器(Hull Shader)**:定义细分因子,决定每个图元被细分的程度。
  • **曲面细分器(Tessellator)**:固定功能单元,根据细分因子实际生成新的顶点和拓扑。
  • **域着色器(Domain Shader)**:计算新顶点的位置、法线等属性,通常结合位移贴图。

在OpenGL中,对应的是曲面细分控制着色器(TCS)、曲面细分引擎和曲面细分评估着色器(TES)。

主要应用场景

平滑曲面

通过细分粗糙的网格并使用平滑算法(如PN三角形),生成类似高精度模型的曲面。常用于角色皮肤、汽车车身等。

位移贴图

结合高度图或位移贴图,在域着色器中将顶点沿法线方向偏移,生成真实的凹凸几何细节,如地形褶皱、浮雕等。

自适应LOD

根据摄像机距离动态调整细分因子:近处物体细分更多,远处物体细分更少,从而实现连续且高效的细节过渡,避免传统LOD的跳变。

地形渲染

利用视锥体裁剪和距离判断,只对可见且近处的地形块进行高细分,节省性能。

优点与局限

**优点**:

  • 初始模型只需低多边形,通过细分实时增加细节,节省内存和带宽。
  • 支持动态LOD,使几何复杂度随距离平滑变化。
  • 与位移贴图结合可生成高度逼真的表面细节。

**局限**:

  • 需要支持曲面细分的GPU和图形API(DX11+ / OpenGL 4+),部分移动平台不支持。
  • 细分因子设置不当可能导致性能下降或产生裂缝(T-junctions)。
  • 对顶点着色器后的数据有额外计算开销,大量细分可能成为瓶颈。

与相关技术的区别

  • **法线贴图**:仅改变光照计算,不改变几何形状。
  • **视差贴图**:在片元着色器中偏移纹理坐标模拟深度,但不改变几何拓扑。
  • **位移贴图**:通常需要曲面细分来提供足够的顶点密度,否则位移无法体现细节。

曲面细分是真正的几何操作,生成的新顶点参与后续管线处理,因此可产生正确的轮廓和阴影。

实现示例(伪代码)

```

// 外壳着色器:设置细分因子

HS_CONSTANT_DATA_OUTPUT ConstantsHS(InputPatch<VS_OUTPUT, 3> p, uint PatchID : SV_PrimitiveID)

{

// 根据距离计算细分因子

float tessFactor = ComputeTessFactorFromDistance(p);

HS_CONSTANT_DATA_OUTPUT output;

output.Edges[0] = output.Edges[1] = output.Edges[2] = tessFactor;

output.Inside = tessFactor;

return output;

}

// 域着色器:计算新顶点位置

[domain("tri")]

DS_OUTPUT DomainShader(HS_CONSTANT_DATA_OUTPUT input, float3 uvw : SV_DomainLocation, const OutputPatch<VS_OUTPUT, 3> patch)

{

DS_OUTPUT output;

float3 p = uvw.x * patch[0].pos + uvw.y * patch[1].pos + uvw.z * patch[2].pos;

// 可应用位移贴图

p += Displacement(p, uvw);

output.pos = mul(float4(p, 1.0f), ViewProjMatrix);

return output;

}

```

常见问题

曲面细分和位移贴图是什么关系?

位移贴图需要足够的顶点密度才能体现细节,曲面细分可以动态增加顶点数量,因此两者常结合使用。曲面细分提供几何基础,位移贴图在域着色器中对顶点进行偏移。

曲面细分在哪些图形API中可用?

DirectX 11及以上版本、OpenGL 4.0及以上版本、Vulkan和Metal(部分支持)都支持曲面细分。需要注意的是,部分移动GPU可能不支持或性能较差。

曲面细分会影响性能吗?

是的,曲面细分会增加顶点数量和计算量,但通过自适应细分因子(如根据距离调整)可以平衡性能与画质。合理使用可获得较好收益。

曲面细分和法线贴图有什么区别?

法线贴图仅改变光照计算中的法线,不改变几何形状;曲面细分实际生成新的几何顶点,改变表面拓扑,因此轮廓和阴影也更真实。

如何在Unity中使用曲面细分?

Unity的HDRP和URP支持曲面细分着色器,需要在Shader中编写外壳和域着色器,或使用内置的曲面细分选项。具体可参考Unity文档。