Opengl 几何体着色器GLSL中的变量输出基本体计数

Opengl 几何体着色器GLSL中的变量输出基本体计数,opengl,glsl,geometry-shader,Opengl,Glsl,Geometry Shader,我想在我的几何体着色器中执行以下操作: uniform int maxOutputVert; layout(points) in; layout(points, max_vertices=maxOutputVert) out; 但是,我在编译时出错: Error: error(#132) Syntax error: 'maxOutputVert' parse error 着色器将不会编译 我可以理解,如果该变量在每次着色器运行中都会发生变化,那么内存管理可能会太困难,但在这里,通过单个绘图

我想在我的几何体着色器中执行以下操作:

uniform int maxOutputVert;

layout(points) in;
layout(points, max_vertices=maxOutputVert) out;
但是,我在编译时出错:

Error: error(#132) Syntax error: 'maxOutputVert' parse error
着色器将不会编译

我可以理解,如果该变量在每次着色器运行中都会发生变化,那么内存管理可能会太困难,但在这里,通过单个绘图调用它将是常量,因为制服是常量。如果我在着色器中定义某个整数常量并将其用作max_顶点计数,它也会失败:

const int a = 5;
layout(points, max_vertices=a) out;
同样的错误也会产生。所以有没有办法做到这一点,或者我只需要在调用中输入一个数字,否则它将无法编译。如果是第二种情况,我如何通过以下方式确保不会超过主进程内查询的最大输出数:

glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &maxoutput);

编辑:很抱歉,我忘了提及我使用的是ATI/AMD,Catalyst版本是2010.1105.19.41785(这是我尝试过的最稳定的版本…

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

从模板着色器源开始:

uniform int maxOutputVert;

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

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

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

从模板着色器源开始:

uniform int maxOutputVert;

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

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

您确实意识到这只是您在布局中传递的最大数字。几何体着色器仍然可以有条件地生成数量可变的输出基本体,只要它们在指定的范围内。这是真的,但这实际上是如何工作的?如果我将max_顶点定义为1000个,并且只创建20个基本体,它会占用1000或20个顶点及其变量的内存吗?我很确定这样的高估会带来惩罚,但我不知道确切的情况。你知道这只是你在布局中传递的最大数量。几何体着色器仍然可以有条件地生成数量可变的输出基本体,只要它们在指定的范围内。这是真的,但这实际上是如何工作的?如果我将max_顶点定义为1000,并且只创建20个基本体,它会消耗1000个或20个顶点及其变量的内存吗?我很确定这样的高估会带来惩罚,但我不知道确切情况。