2011-10-30 45 views
1

我想要做这样的事情在我的几何着色器:可变输出原语几何着色器GLSL算

uniform int maxOutputVert; 

layout(points) in; 
layout(points, max_vertices=maxOutputVert) out; 

但是我得到的错误,而它编译:

Error: error(#132) Syntax error: 'maxOutputVert' parse error 

和Shader不会编译。

我能理解,这可能是太硬了内存管理,如果这个变量将在每个着色器运行的变化,但在这里,它会不断深入单一绘图调用,因为校服是恒定的。产生

const int a = 5; 
layout(points, max_vertices=a) out; 

同样的错误:如果我定义着色器的一些整型常量的权利,并以此作为计数max_vertices它也失败。所以有办法做到这一点,或者我只需要在该调用中输入一个数字,否则将无法编译。如果第二个是这样,我怎么能保证我不会超过主进程中查询的最大输出页数:

glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &maxoutput); 

编辑:对不起,我忘了提我使用的是ATI/AMD和Catalyst的版本是2010.1105.19.41785(这是最稳定的,我试过...)

+0

你一定要明白这只是要传递的布局的最大数量。几何着色器仍然可以产生可变数量的输出原语的有条件的,只要它们是在规定范围内。 – kvark

+0

这是真实的,但实际上是如何工作的呢?如果我定义max_vertices为1000,并创建只有20元,将它吃内存1000点或20的顶点及其varyings? – Raven

+0

我敢肯定有这样的高估了点球,但我不知道到底。 – kvark

回答

4

着色器布局是在编译时确定的东西,它不能被parametized这样。对于布局中的每个差异,您都需要一个自己的着色器。所以你可以做的是,在上传之前修改着色器源代码。事情是这样的:

开始使用模板着色代码:

uniform int maxOutputVert; 

layout(points) in; 
layout(points, max_vertices=$MAXOUTPUTVERTICES$) out; 

并提交此为glShaderSource之前,替换字符串$MAXOUTPUTVERTICES$与数量。