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

Is it possible to check drawing mode in shader and change some vertex attr accordingly?

我正在处理一个 OpenGL 项目,我必须在其中绘制彩色网格块以及(white/black)块中每个单元格的边界线。

组成单元格的顶点位置与用于线条(边框)的顶点位置相同..但是它们在用于绘制面(三角形)时会着色,而在用于绘制线条时具有静态颜色.

所以我的问题是,有没有办法知道着色器内的绘图模式并在使用 GL_LINES 时分配静态颜色,否则使用 VBO 中的颜色?

编辑:第二个问题突然出现在我的脑海中。如果我使用相同的顶点绘制三角形和线条,线条会被面遮挡还是相反?

顶点着色器无法知道它们所使用的图元类型。

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

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

  • Uber-shader风格。统一指定是使用静态颜色还是动态颜色。例如,这是完全合法的:

    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);
    }
    

    这通常用于 high-end 游戏,以防止必须大量交换着色器。对于您的用例,它可能过多。但它的优点是您需要担心的着色器文件更少并且 bug-fix.

  • 使用unarrayed attributes。当你 glDisableVertexAttribArray 一个属性,而你的着色器无论如何都会查看该值时,着色器获得的值来自一个全局状态。这个全局状态可以用 glVertexAttrib 函数设置。它的性能特征是未知的,因为很少有代码使用它。它也可能是越野车。