【技术美术】顶点技术概述

【技术美术】顶点技术概述

顶点是GPU渲染管线中顶点着色器的输入,其结构完全由用户自定义。不过在行业中,一些顶点属性已经成了事实标准。通常来讲,顶点具有如下属性:

  • float3 position:位置(绘制坐标,一般基于物体空间,通过变换转到NDC空间)
  • float3 normal:法线(顶点的朝向,用于实现需要方向信息的计算,如光照)
  • float4 tangent:切线(与法线配合可构成切线空间,实现以顶点为坐标系的功能,如法线贴图)
  • float2 uv:纹理坐标(实现顶点到纹理的映射,从而支持采样额外的纹理数据)
  • float4 color:颜色(额外的基于顶点存储的数据,可以按需使用)

顶点属性唯一性

对于每种属性,顶点同时只能持有一个。

但在一些建模软件中会发现,顶点可以同时持有多个不同的同名属性值,例如一个顶点根据不同的相邻面可以有多个法线,从而实现锐边。不过这些其实是建模软件自行实现的功能,并不能存储到GPU中实际使用的顶点数据中。当带有这种顶点的网格放入到Unity中时,Unity实际会将这些数据拆分,分配到多个新生成的顶点中。

如果此时制作一些顶点偏移的特效,就很容易出现破面的情况。虽然原始模型中,这些面是相连的,但 Unity 为了保证顶点属性的唯一性,为每个面分配了各自的顶点,于是面就断开了。

顶点光栅化

顶点数据是基于顶点存储,但利用光栅化,这些数据也可以通过插值传递给像素。但这种插值方式是线性插值的,因此针对某些数据时,存在一些问题。

非线性数据错误

非线性数据错误

黑色箭头是来自顶点的法线,而红色箭头是其经过光栅化插值的结果。显然由于法线作为方向,其应该是归一化的,所以那些绿色箭头才是期望的正确的结果。

针对这种错误的解决方法就是在光栅化后进行数据矫正,例如归一化法线。

非线性布局错误

非线性数据错误

黑色圆点是顶点,红色线是线性插值带来的数据变化分布。明显可以看到中间顶点与两点顶点间的数据变化形成了尖角,这种忽然的不连续变化会导致视觉上接缝的产生。实际上我们期望制作的是一个圆润的圆盘,所以绿色实线才是期望的数据变化分布。

针对这种错误的解决方法就是不用顶点存储非线性数据,而是在光栅化后自行通过其他方法计算出这种非线性数据,例如uv极坐标转换。

切线空间

有些功能例如“法线贴图”、“视差贴图”等期望能在一个基于顶点的空间坐标系进行计算,这就引出了切线空间的需求。切线、法线和由两者叉乘得出的副切线,就构成了形成切线空间的3个基向量。

【技术美术】切线空间

顶点颜色

当顶点需要存储额外数据时有两种方式:

  • uv+纹理
  • 顶点颜色

但当存储一些特定于顶点的非纹理数据时,“uv+纹理”的方案存在一些问题:

  1. 由于需要经过二次查找才能拿到数据,根据uv精度、纹理分辨率、采样器的不同很容易导致数据读取不准确。
  2. uv存在缝合边的问题,逻辑上相同的顶点uv却不一定相同,进一步导致了数据读写的误差产生,还会导致断面。

所以部分情况下采用顶点颜色存储数据比纹理更加方便易用,不过可惜的是 Unity 仅提供一个顶点颜色属性,因此其存储容量是有限的。

posted @ 2025-12-23 21:16  BDFFZI  阅读(1)  评论(0)    收藏  举报