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

时间:2015-11-13 22:47:40

标签: opengl glsl shader

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

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

它真的像这样工作吗?是否有可能干扰插值过程?

2 个答案:

答案 0 :(得分:2)

您有两种选择:

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

第二个是在顶点着色器的正常输出上使用flat interpolation quantifier;将从原始的provoking vertex中选取法线。这比复制每个顶点的内存效率更高,但您需要注意渲染的顺序,以便为面部指定正确的法线。

答案 1 :(得分:0)

如果为每个顶点指定法线,则会进行插值。但这不是你为立方体做这个的方法。立方体包含8个顶点,但您需要24个法线,具体取决于面。因此,对于左下 - 前 - 顶点,您可以为底面,左面和前面指定一个自己的法线。

这与着色立方体相同。如果要为立方体的每个角都插入颜色,则只为每个顶点指定一种颜色。如果你想让每一面都以自己的方式着色,你需要为每个面部分配颜色。

对于有操纵的部分:你可以操纵你得到的每一个输入。如果这是有道理的,那就值得怀疑。例如,为了防止插值,你可以为0..1之间的每个值设置一个if条件,并将其设置为1.对于负值是相同的,如果它正好是0则相同。然后它应该适用于每个顶点赋值。可能需要一些试验和错误。

使其更清晰:着色器从3个顶点值中绘制三角形。每个包含位置,正常,颜色,你想要的。因此,对于着色器,如果具有相同位置的顶点在不同三角形中具有不同的颜色值等,则无关紧要。插值仅发生在三角形内部,因此如果每个三角形中顶点的法线相同,则整个三角形具有此法线。但要注意:使用其他绘图样式(如三角形条带)会使这更加困难,因为他对多个三角形使用了一个顶点定义。