我想在几何着色器中执行类似的操作:
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(这是我试过的最稳定的......)
答案 0 :(得分:4)
着色器布局是在编译时确定的,并且不能像这样进行参数化。对于布局中的每个差异,您需要一个自己的着色器。所以你可以做的是,在上传之前修改着色器源代码。像这样:
从模板着色器源开始:
uniform int maxOutputVert;
layout(points) in;
layout(points, max_vertices=$MAXOUTPUTVERTICES$) out;
在向glShaderSource提交之前,将字符串$MAXOUTPUTVERTICES$
替换为数字。