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

时间:2016-01-08 17:45:03

标签: opengl shader

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

构成单元格的顶点位置与用于线条(边框)的顶点位置相同。但是,当用于绘制面(三角形)时,它们将被着色,并且在用于绘制线条时具有静态颜色。 / p>

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

编辑:第二个问题刚刚出现在我脑海中..如果我使用相同的顶点来绘制三角形和线条,那么这些线条会被面部遮挡,还是反过来?

1 个答案:

答案 0 :(得分:2)

顶点着色器无法知道它们用于的原始类型。

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

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

  • 优步着色风格。有统一指定是使用静态还是动态颜色。例如,这是完全合法的:

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

    这通常用于高端游戏,以防止不得不交换着色器。对于您的用例,它可能过多。但它的确有一个优点,就是你可以减少shader文件的数量并进行bug修复。

  • 使用unarrayed attributes。当您glDisableVertexAttribArray获取属性时,着色器无论如何都会查看该值,着色器获取的值来自一个全局状态。可以使用glVertexAttrib函数设置此全局状态。其性能特征尚不清楚,因为很少有代码使用它。它也可能是错误的。