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

Posted

技术标签:

【中文标题】是否可以在着色器中检查绘图模式并相应地更改一些顶点属性?【英文标题】:Is it possible to check drawing mode in shader and change some vertex attr accordingly? 【发布时间】:2016-01-08 17:45:02 【问题描述】:

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

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

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

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

【问题讨论】:

统一编码绘制模式? “如果我使用相同的顶点来绘制三角形和线条,线条会被面遮住还是相反?”那是一个单独的问题。这取决于您是否启用了深度测试以及渲染的顺序。 @genpfault care 详细说明一下? @NicolBolas,好吧,顶点在同一个坐标上..所以我知道深度测试将如何处理它..也许渲染顺序会影响输出,所以最后绘制的内容会掩盖最先绘制的内容..这不是你说的吗? @MostafaWasat:请参阅 Nicol 的第二个要点。 【参考方案1】:

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

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

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

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

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

这通常用于高端游戏中,以防止不得不大量交换着色器。对于您的用例,它可能过多。但它确实有一个优势,即您无需担心和修复错误的着色器文件。

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

【讨论】:

是的,我想我现在明白了,我所要做的就是在绘制线条之前将 uniform bool is_color_static 设置为 true,然后再将其重置?我做对了吗?..

以上是关于是否可以在着色器中检查绘图模式并相应地更改一些顶点属性?的主要内容,如果未能解决你的问题,请参考以下文章

在顶点着色器中更改顶点的颜色

GLSL索引绘图并设置纹理案例

openGL之API学习(一六六)glVertexAttrib*函数

在顶点和片段着色器中访问同名统一失败

OpenGL实例化数组绘图

WebGL纹理颜色原理