是否可以检查着色器中的绘制模式并相应地更改一些顶点属性



我正在进行一个OpenGL项目,在该项目中,我必须绘制一个彩色网格块以及与块中每个单元接壤的(白/黑)线。

组成单元格的顶点位置与用于线(边界)的顶点位置相同。。然而,当用于绘制面(三角形)时,它们将被着色,而当用于绘制线时,它们具有静态颜色。

所以我的问题是,如果使用了GL_LINES,是否有方法知道着色器内部的绘制模式并指定静态颜色,否则使用VBO中的颜色?

编辑:我突然想到第二个问题。。如果我使用相同的顶点来绘制三角形和直线,这些直线会被面遮挡吗?还是相反?

顶点着色器无法知道它们用于的基本体类型。

解决这个问题的一般方法是:

  • 在绘制静态和动态颜色之间更改程序。根据颜色是来自输入数组还是来自统一,使用不同的程序。

  • Uber着色器样式。有一个统一的指定是使用静态还是动态颜色。例如,这是完全合法的:

    uniform bool is_color_static;
    in vec4 dyn_color;
    uniform vec4 static_color;
    void use_color(in vec4 color) {...}
    void main()
    {
      if(is_color_static)
        use_color(static_color);
      else
        use_color(dyn_color);
    }
    

    这通常用于高端游戏中,以防止频繁交换着色器。对于您的用例来说,它可能是过度的。但它的优点是可以减少需要担心的着色器文件和错误修复。

  • 使用未映射的属性。如果为属性glDisableVertexAttribArray,并且着色器仍会查看该值,则着色器获得的值来自全局状态。可以使用glVertexAttrib函数设置此全局状态。它的性能特征是未知的,因为很少有代码使用它。它也可能有缺陷。

最新更新