顶点的线性插值以在 Metal 中实现多面外观

jac*_*ujh 1 graphics rendering metal

我试图用金属制作艺术外观。实现的效果是基于三角形图元渲染一个多面的茶壶,而不是一个光滑圆润的茶壶。我不知道我怎么能做到这一点。我知道我应该告诉 Metal 计算三角形内的像素,就好像三角形是平面的一样,而不是查看附近的三角形并插入像素。我应该在顶点函数中执行此操作,还是使用光栅化过程进行一些设置?

茶壶

(图片:https : //sketchfab.com/3d-models/art-reference-utah-teapot-4c02605ea63541b6aa053df167befe36

Ego*_*rov 5

控制面部外观的东西是属性插值。

有许多不同种类的插值,您可以在 Metal Shading Language Specification(https://developer.apple.com/metal/Metal-Shading-Language-Specification.pdf , 4.5 Sampling and Interpolation Attributes)中查看它们。

如果您想要平面外观,有两种方法可以做到:您要么想要使用flat插值,要么更改初始模型。

您可以在着色器代码中设置插值。您需要使用用于插值的属性来装饰片段着色器输入。

如果您有定向照明或任何其他照明,要实现这种平面外观,您的法线将需要在整个面部平坦,为此您需要像这样标记片段着色器输入

struct FragmentInput
{
    float3 position;
    float4 color;
    float3 normal [[flat]];
};
Run Code Online (Sandbox Code Playgroud)

平面插值将使用来自三角形中第一个顶点的数据并将其用于整个三角形。

结果也将在某种程度上取决于初始顶点数据本身。

另一种方法是让属于一个面的顶点(在您的情况下,一个面是由两个三角形组成的正方形)具有相同的法线值。这样你的模型会有更多的顶点(一些顶点将共享相同的位置,但它们将属于不同的面)。您应该可以在任何 3D 编辑器中执行此操作。

您可以尝试使用不同类型的插值来实现不同的外观。

感谢@warrenm 关于激发顶点的评论。

  • 平面插值在整个图元中使用相同的值,但正如您所提到的,您还需要考虑使用哪个顶点的值。OpenGL 和 DirectX 有不同的默认约定来选择所谓的[挑衅顶点](https://www.khronos.org/opengl/wiki/Primitive#Provoking_vertex),AFAIK Metal 没有声明约定或使其可配置. 要获得“正确”的面法线,可能需要复制茶壶中的顶点并将每个顶点的法线设置为其面的法线,或者单独存储法线并通过 `vertex_id` 显式获取它们。 (2认同)