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

发布于 2024-12-12 20:24:30 字数 737 浏览 1 评论 0原文

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

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 (这是我尝试过的最稳定的...)

I want to do something like this in my geometry shader:

uniform int maxOutputVert;

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

However I get error while compiling it:

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

and shader won't compile.

I could understand that it might be too hard for memory management if that variable would change in each shader run, but here it would be constant thorough single drawing call, because uniforms are constant. It also fails if I define some integer constant right in shader and use it as max_vertices count:

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

Same error is generated. So is there way to do this or do I simply have to put a number inside that call or it won't compile. If the second is the case, how can I assure that I won't exceed the maximum output number queried inside main process by:

glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES, &maxoutput);

Edit: Sorry for I forgot to mention I'm using ATI/AMD and the Catalyst version is 2010.1105.19.41785 (it's the most stable I've tried...)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

苄①跕圉湢 2024-12-19 20:24:30

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

从模板着色器源开始:

uniform int maxOutputVert;

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

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

The shader layout is something determined at compilation time, and it cannot be parametized like this. For each difference in layout you need a own shader. So what you can do is, modify the shader sourcecode before upload. Something like this:

Start with a template shader source:

uniform int maxOutputVert;

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

And before submitting this as to glShaderSource, replace the string $MAXOUTPUTVERTICES$ with the number.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文