代码之家  ›  专栏  ›  技术社区  ›  Sergey

从片段明暗器中的所有顶点变差,不进行插值。为什么不呢?

  •  2
  • Sergey  · 技术社区  · 6 年前

    如果我们从任何几何阶段(顶点、几何体或苔丝明暗器)传递一个变化到片段明暗器,我们总是会释放一些信息。基本上,我们通过两种方式释放它:

    • 通过插值:平滑、无个性或质心-不重要。如果我们在几何阶段传递了3个浮点(每个顶点一个),那么在片段阶段只会得到一个混合浮点。
    • 通过丢弃。做的时候 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中,我需要进行整数索引 tricks 或者在片段着色中除以重心坐标,如果我想要所有顶点的值。

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   BDL Vyxzl    6 年前

    是很难在硬件中实现,还是着色编码器没有广泛的要求?

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

    或者我不知道?

    好吧,在未扩展的GL中,目前(GL4.6)没有这样的功能。但是,有两个相关的GL扩展:

    它基本上提供了您需要的特性。