1

我想在我的几何着色器中做这样的事情:

uniform int maxOutputVert;

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

但是我在编译时出错:

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

并且着色器不会编译。

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

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

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

glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &maxoutput);

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

4

1 回答 1

4

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

从模板着色器源开始:

uniform int maxOutputVert;

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

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

于 2011-10-30T14:36:58.663 回答