我正在学习几何着色器,并且我有一个用例需要使用它。
出于性能原因,即使作为一种传递方式,大多数对象大部分时间都不需要使用几何着色器,因此我不想始终使用几何着色器。但是当我需要时,顶点和片段着色器应该做相同的事情。我能重复使用我的顶点和片段着色器吗?
例如:
顶点着色器:
#version 330
in vec3 position;
out vec3 whatever;
void main()
{
...
}
几何学:
#version 330
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
in whatever[];
out whatever;
void main()
{
...
}
片段:
#version 330
in whatever
void main()
{
...
}
没有几何着色器时,这个程序工作正常,因为顶点out whatever
对应片段in whatever
。但是使用几何着色器后,我不得不将whatever重新定义为in和out。
我读到可以使用:layout(location = 0)out whatever
,然后您不需要相同的名称,但这对我不起作用,并导致编译错误:ERROR:-1:65535:'' :存储限定符与布局限定符id无效
。我认为这是由于我没有足够新的OpenGL版本支持该语法。
我也读到可以使用扩展:arb_separate_shader_objects,但未找到任何示例。
有什么建议吗?
layout (location = 0) out whatever
,但这在GLSL 3.30中不会编译通过。该功能是在GL 4.2中添加的,并且也是ARB_separate_shader_object规范的一部分。因此,您可以在3.30中使用它,但还需要在着色器中显式请求使用该扩展。 - Nicol Bolas