我正在开发一个OpenGL项目,我必须绘制一个彩色网格块以及与块中每个单元格接壤的(白色/黑色)线。
构成单元格的顶点位置与用于线条(边框)的顶点位置相同。但是,当用于绘制面(三角形)时,它们将被着色,并且在用于绘制线条时具有静态颜色。 / p>
所以我的问题是,有没有办法知道着色器内的绘图模式,如果使用GL_LINES则分配静态颜色,否则使用VBO中的颜色?
编辑:第二个问题刚刚出现在我脑海中..如果我使用相同的顶点来绘制三角形和线条,那么这些线条会被面部遮挡,还是反过来?答案 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
函数设置此全局状态。其性能特征尚不清楚,因为很少有代码使用它。它也可能是错误的。