【发布时间】:2016-01-15 17:43:23
【问题描述】:
所以我只是在学习几何着色器,我有一个用例。
出于性能原因,我不想一直使用几何着色器,即使作为通道,因为大多数对象大部分时间都不需要它。但是,当我确实想要它时,顶点和片段着色器应该做同样的事情。我可以重复使用我的顶点和片段着色器吗?
IE。
顶点:
#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。然而,使用几何着色器,我最终将任何东西重新定义为输入和输出。
我读到您可以使用:layout (location = 0) out whatever,然后您不需要相同的名称,但这对我不起作用,编译错误:ERROR: -1:65535: '' : storage qualifier not valid with layout qualifier id。我认为这是因为我没有足够新的 opengl 版本来支持该语法。
我还读到您可以使用扩展名:arb_separate_shader_objects,但未能找到任何使用它的示例。
有什么建议吗?
【问题讨论】:
-
"我读到您可以使用:
layout (location = 0) out whatever" Taht 无法编译,因为您使用的是 GLSL 3.30。该功能是在 GL 4.2 中添加的,也是 ARB_separate_shader_object 规范的一部分。所以你可以在 3.30 中使用它,但你还需要explicitly request the use of that extension in your shader。 -
谢谢,但您的其他答案似乎是更好的方法。
标签: opengl glsl shader geometry-shader