我对GLSL和子程序的组成有疑问。简单地说,我希望有两个子程序类型,两个指向当前子程序的类型的制服和这些子程序类型的几个实现,允许一种类型的子程序调用另一种类型的子程序(通过那些子程序制服)< / p>
它的glsl代码如下所示:
subroutine float ComputeShadow(vec3 pos, ...);
subroutine float ExtractDepth(sampler2d depthmap ...);
subroutine uniform ComputeShadow u_CurrentShadowStrategy;
subroutine uniform ExtractDepth u_CurrentExtractDepth;
...
[subroutine(ComputeShadow)]
float SoftShadowAlgorithm(vec3 pos ..)
{
...
float depth = u_CurrentExtractDepth( ...);
..
}
void main()
{
..
float shadow = u_CurrentShadowStrategy( ..);
}
在使用Nvidia卡和当前驱动程序(331.20)的Linux上,在链接片段阶段的程序时,应用程序只是因为这段代码而崩溃。该规范根本没有提到这种用法,这个用例对我来说很有意义。
我的问题是:上面的示例是一个合理的子例程用例,它应该有效吗?如果它不应该出于什么原因?