opengl - 与片段着色器中的所有顶点不同,没有插值。为什么不?

标签 opengl glsl language-lawyer specifications

如果我们将任何几何阶段(顶点、几何或苔丝着色器)的变化传递到片段着色器,我们总是会丢失一些信息。基本上,我们通过两种方式失去它:

  • 通过插值:平滑、无透视或质心 - 无关紧要。如果我们在几何阶段传递了 3 个浮点(每个顶点一个),那么在片段阶段我们将只得到一个混合浮点。
  • 通过丢弃。进行平面插值时,硬件会丢弃除激发顶点之外的所有值。

为什么 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 中,我需要进行整数索引 tricks或者如果我想要来自所有顶点的值,则除以片段着色器中的重心坐标。

很难在硬件中实现,还是着色器编码人员没有广泛要求?还是我不知道?

最佳答案

Is it hard to implement in hardware, or is it not widely requested by shader coders?

典型的着色算法通常不需要它。传统上,每个片段都会(或多或少)自动插值。在当前一代硬件中实现可能并不太难,因为至少现代桌面 GPU 通常使用“拉模型插值”(参见 Fabian Giesen's blog article ),这意味着实际插值已经在着色器中完成,固定功能hw 仅提供插值系数。但这是司机对你隐藏的。

Or am I not aware of it?

嗯,在未扩展的 GL 中,目前(GL 4.6)没有这样的功能。但是,有两个相关的 GL 扩展:

它基本上提供了您所要求的功能。

关于opengl - 与片段着色器中的所有顶点不同,没有插值。为什么不?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53827053/

相关文章:

c++ - 模板代码在 G++ 下工作正常,但在 VC++ 下出错

delphi - 如何在 OpenGL 中绘制旋转棱镜?

c++ - 我需要为 OpenGL 3.3 Core 使用着色器吗?

opengl - GLSL 字节顺序宏

opengl - 条件语句会减慢着色器的速度吗?

c++ - 为什么在已删除指针上调用非虚拟成员函数是未定义的行为?

opengl - glBitmap 和 glTexImage2D 之间的区别

OpenGL透视投影像素完美绘图

c++ - 在glsl中初始化全局变量?

c++ - 具有单继承的类的指针转换偏移