Graphics 顶点的线性插值以实现金属中的镶嵌面外观

Graphics 顶点的线性插值以实现金属中的镶嵌面外观,graphics,rendering,metal,Graphics,Rendering,Metal,我试着用金属做一个艺术造型。要实现的效果是基于三角形基本体渲染多面茶壶,而不是平滑圆润的茶壶。我不知道我怎样才能做到这一点。我知道我应该让Metal计算三角形内部的像素,就像三角形是平面的一样,而不是看附近的三角形并插值像素。我应该在顶点函数中这样做,还是在光栅化过程中进行一些设置 (图:)控制人脸外观的是属性插值 有许多不同类型的插值,您可以在金属着色语言规范(、4.5采样和插值属性)中查看它们 ) 如果想要平面外观,有两种方法:使用flat插值或更改初始模型 可以在着色器代码中设置插值。您

我试着用金属做一个艺术造型。要实现的效果是基于三角形基本体渲染多面茶壶,而不是平滑圆润的茶壶。我不知道我怎样才能做到这一点。我知道我应该让Metal计算三角形内部的像素,就像三角形是平面的一样,而不是看附近的三角形并插值像素。我应该在顶点函数中这样做,还是在光栅化过程中进行一些设置


(图:)

控制人脸外观的是属性插值

有许多不同类型的插值,您可以在金属着色语言规范(、4.5采样和插值属性)中查看它们 )

如果想要平面外观,有两种方法:使用
flat
插值或更改初始模型

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

如果有定向照明或任何其他照明,要实现此平面外观,法线需要在面上保持平面,要做到这一点,您需要像这样标记片段着色器输入

struct FragmentInput
{
    float3 position;
    float4 color;
    float3 normal [[flat]];
};
平面插值将使用三角形中第一个顶点的数据,并将其用于整个三角形

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

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

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


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

控制面外观的是属性插值

有许多不同类型的插值,您可以在金属着色语言规范(、4.5采样和插值属性)中查看它们 )

如果想要平面外观,有两种方法:使用
flat
插值或更改初始模型

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

如果有定向照明或任何其他照明,要实现此平面外观,法线需要在面上保持平面,要做到这一点,您需要像这样标记片段着色器输入

struct FragmentInput
{
    float3 position;
    float4 color;
    float3 normal [[flat]];
};
平面插值将使用三角形中第一个顶点的数据,并将其用于整个三角形

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

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

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


由于对引发顶点的注释的@ WalRm。

平坦插值在整个原语中使用相同的值,但正如你提到的,还需要考虑使用哪一个顶点的值。OpenGL和DirectX有不同的默认约定来选择所谓的,而AFAIK Metal没有声明约定或使其可配置。要获得“正确”的面法线,可能需要复制茶壶中的顶点,并将每个顶点的法线设置为其面的法线,或者单独存储法线,并通过
vertex\u id
@warrenm显式获取法线,您可以通过更改初始顶点来实现该外观,但是我认为平放也可以。顺便说一句,激发顶点是这里描述的第一个顶点()@warrenm,我已经更新了答案,以包括你提到的另一种方式,谢谢。很好,我忘记了有文档记录。我主要担心的是,如果使用使用“平滑”法线创建的模型(即,顶点的法线是其所属面的加权平均值,并且通过索引消除重合顶点的重复),则这些法线将不是平面着色所需的法线。即使非常仔细地编写每个三角形中哪个顶点首先出现,根据鸽子洞原理,你也无法为每个顶点生成一条合适的法线,而不需要一些重复。是的,这就是我的想法,因为面实际上是三角形而不是正方形。但也许他会发现平面插值是有用的。平面插值在整个原语中使用相同的值,但是正如你提到的,你也需要考虑使用哪一个顶点的值。OpenGL和DirectX有不同的默认约定来选择所谓的,而AFAIK Metal没有声明约定或使其可配置。要获得“正确”的面法线,可能需要复制茶壶中的顶点,并将每个顶点的法线设置为其面的法线,或者单独存储法线,并通过
vertex\u id
@warrenm显式获取法线,您可以通过更改初始顶点来实现该外观,但是我认为平放也可以。顺便说一句,激发顶点是这里描述的第一个顶点()@warrenm,我已经更新了答案,以包括你提到的另一种方式,谢谢。很好,我忘记了有文档记录。我主要担心的是,如果使用使用“平滑”法线创建的模型(即,顶点的法线是其所属面的加权平均值,并且通过索引消除重合顶点的重复),这些法线