如果我们将任何几何图形阶段(顶点,几何图形或tess着色器)的变化传递给片段着色器,我们总是会丢失一些信息。基本上,我们通过两种方式来放松它:
flat
插值时,硬件会从激发顶点中丢弃除一个值以外的所有值。为什么OpenGL不允许这样的功能:
顶点着色器:
// nointerp is an interpolation qualifier I would like to have
// along with smooth or flat.
nointerp out float val;
main()
{
val = whatever;
}
片段着色器:
nointerp in float val[3];
// val[0] might contain the value from provoking vertex,
// and the rest of val[] elements contain values from vertices in winding order.
main()
{
// some code
}
在GLSL 330中,如果需要所有顶点的值,则需要制作整数索引技巧或用片段着色器中的重心坐标除。
是很难在硬件中实现,还是着色器编码器未广泛要求它?还是我不知道?
是很难在硬件中实现,还是着色器编码器未广泛要求它?
通常只是在典型的着色算法中不需要它。因此,传统上,每个片段都有自动(或多或少)插值。在目前的世代硬件上可能不太难实现,因为至少无论如何现代台式机GPU通常都使用“拉模型插值”(请参见Fabian Giesen的博客文章),这意味着实际的插值已经在着色器中完成了,固定的函数hw仅提供插值系数。但这对于驾驶员是不可见的。
还是我不知道?
好吧,在未扩展的GL中,当前(GL 4.6)没有这种功能。但是,有两个相关的GL扩展:
基本上可以提供您要的功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句