片段着色器中所有顶点的变体,没有插值。为什么不?

谢尔盖

如果我们将任何几何图形阶段(顶点,几何图形或tess着色器)的变化传递给片段着色器,我们总是会丢失一些信息。基本上,我们通过两种方式来放松它:

  • 通过插值:平滑,无角度或质心-无关紧要。如果在几何阶段传递了3个浮点数(每个顶点一个),则在片段阶段将仅获得1个混合浮点数。
  • 通过丢弃。进行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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

此WebGL程序中的顶点着色器和片段着色器之间何时进行插值?

glsl片段着色器如何从每个顶点获取非插值数据

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

有没有办法在片段着色器上从顶点着色器到一个点的位置绘制一个圆?

有没有办法丢弃OpenGL着色器中的几何图形,顶点或片段?

顶点着色器和像素着色器有什么关系?

Perlin杂点函数在顶点着色器中坏了,但在片段着色器中没有坏吗?

如果片段着色器不支持高精度,则带有“ highp”限定符的顶点着色器“ varying”变量会发生什么情况?

是否可以使用具有或不具有几何体着色器的相同顶点着色器和片段着色器?

为什么有些像素在片段着色器中采样了错误的纹理?

顶点着色器与片段着色器

为什么我的GLSL着色器无法编译而没有错误消息?

为什么这个着色器变量没有改变?(dx12,hlsl)

将顶点位置从顶点传递到片段着色器-仅在使用Nsight进行调试时有效

WebGL顶点着色器属性的有效类型是什么?

为什么必须为片段着色器设置精度?

将片段着色器输出广播到所有FBO颜色附件吗?

OpenGL,片段着色器:没有这样的统一命名

片段着色器似乎没有输出任何颜色

如何通过顶点着色器将数据从顶点着色器传递到片段着色器

为什么几何着色器没有按预期从1点生成4点?

为什么我的模型没有在 LWJGL 中使用着色器和 VBO 渲染任何内容

有什么办法可以在片段着色器中使用先前渲染的结果?

片段着色器如何确定来自顶点着色器输出的片段数?

将统一值传递给顶点和片段着色器

引擎盖下片段着色器中变化变量的插值

片段着色器上的插值从0 +半像素开始

为什么SpriteKit不更新着色器的制服?

为什么不编译opengl着色器?