可变输出基元在几何着色器GLSL中计数

时间:2011-10-30 12:24:30

标签: opengl glsl geometry-shader

我想在几何着色器中执行类似的操作:

uniform int maxOutputVert;

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

但是我在编译时遇到错误:

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

并且着色器无法编译。

我可以理解,如果该变量在每个着色器运行中都会发生变化,那么对于内存管理来说可能太难了,但是在这里它将通过单个绘图调用保持不变,因为制服是常量。如果我在着色器中定义一些整数常量并将其用作max_vertices count:

,它也会失败
const int a = 5;
layout(points, max_vertices=a) out;

生成相同的错误。那么有没有办法做到这一点,或者我只需要在该调用中放入一个数字,否则它将无法编译。如果是第二种情况,我怎样才能确保不会超过主进程中查询的最大输出数量:

glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &maxoutput);

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

1 个答案:

答案 0 :(得分:4)

着色器布局是在编译时确定的,并且不能像这样进行参数化。对于布局中的每个差异,您需要一个自己的着色器。所以你可以做的是,在上传之前修改着色器源代码。像这样:

从模板着色器源开始:

uniform int maxOutputVert;

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

在向glShaderSource提交之前,将字符串$MAXOUTPUTVERTICES$替换为数字。