是否可以操纵从顶点到片段着色器的插值过程?

Is manipulation of the interpolation process from vertex to fragment shader possible?

我是 glsl 编程新手。据我了解,片段着色器中的变量是从顶点着色器给出的线性插值。这就是为什么当你为不同的顶点设置不同的颜色时你有一个颜色渐变。

假设我想渲染一个多边形数量较少的表面,例如一个立方体,我定义顶点法线。我希望每个表面都具有相同的法线,因为当法线被插值时,照明可能看起来很糟糕。

那么真的是这样吗?是否有可能干扰该插值过程?

如果你分配法线'per vertex',它会被插值。但这不是您为多维数据集执行此操作的方式。立方体包含 8 个顶点,但您需要 24 条法线,具体取决于面。因此,对于左下前顶点,您将为底面、左面和正面分配自己的法线。

这就像给立方体上色一样。如果你想为立方体的每个角都插值颜色,只为每个顶点分配一种颜色。如果你想让每一面都以自己的方式着色,你需要为每个面分配颜色。

关于操纵的部分:你可以操纵你得到的每一个输入。如果这有意义是值得怀疑的。例如,为了防止插值,您可以为 0..1 之间的每个值设置一个 if 条件,并将其设置为 1。负值相同,如果恰好为 0,则相同。然后它应该适用于每个顶点分配。可能需要反复试验。

为了更清楚:着色器从 3 个顶点值中绘制三角形。每个都包含位置,法线,颜色,你想要什么。因此,对于着色器而言,具有相同位置的顶点在不同的三角形中是否具有不同的颜色等值并不重要。插值只发生在三角形内部,所以如果每个三角形中顶点的法线都相同,则整个三角形都有这条法线。但要注意:使用三角形带等其他绘图样式会使这变得更加困难,因为他对多个三角形使用一个顶点定义。

你有两个选择:

第一个是复制每个顶点并为其分配不同的法线;每个面都有自己的顶点和法线,因此在它们之间插值法线会产生相同的结果。

第二种是使用原语的flat interpolation quantifier on the normal output of the vertex shader; the normal will the be picked from the provoking vertex。这比复制每个顶点更节省内存,但您需要注意渲染的顺序,以便为面指定正确的法线。