链路错误取决于环路长度

时间:2015-06-29 21:47:53

标签: opengl glsl

我在几何着色器中有一个带有for循环的着色器程序。当for循环长度足够小时,程序链接(并运行)。如果我增加长度,那么我得到一个链接错误(空日志)。着色器在两种情况下编译都很好。这是几何着色器代码(包含我认为相关的所有内容):

#version 330
layout (points) in;
layout (triangle_strip, max_vertices = 256) out;
...
void main()
{
    ...
    for(int i = 0 ; i < 22 ; ++i) // <-- Works with 22, not with 23.
    {
        ...
        EmitVertex();
        ...
        EmitVertex();
        ...
        EmitVertex();
        ...
        EmitVertex();

        EndPrimitive();
    }
}

规范声明:“允许非终止循环。非常长或非终止循环的后果取决于平台。”这可能是一个平台依赖的情况(GeForce GT 640)?随着着色器代码的演变,for循环的最大长度发生了变化(更多代码 - >更小的max),这让我怀疑它与循环展开有关。任何人都可以给我这个问题的更多信息吗? (如果您需要更多代码/说明,请与我们联系。)

1 个答案:

答案 0 :(得分:2)

无法将包含几何着色器的程序链接为GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS限制的一个可能原因。第11.3.4.5节OpenGL 4.5 core profile specifiaction个状态的“几何着色器输出”(我的重点):

  

GEOMETRY_VERTICES_OUT的值有两个与实现相关的限制;它可能不会超过MAX_GEOMETRY_OUTPUT_VERTICES的值,以及顶点总数和所有顶点之和的乘积   所有活动输出变量的组件不得超过MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS的值。 LinkProgram如果确定则会失败   将违反总组件限制。

GL保证此组件限制至少为1024.

您没有粘贴着色器的完整代码,因此不清楚您使用的每个顶点有多少个组件,但这可能是链接失败的原因。

  

如果我增加长度,则会出现链接错误(空日志)。

规范根本不需要任何链接器或编译器消息。但是,Nvidia通常会提供相当不错的日志消息。如果您可以在最新的驱动程序版本中重现“没有日志消息的链接失败”方案,则可能值得提交错误报告。