工作组大小 = 0

Vas*_*ene 0 c# opengl glsl opentk

我想在我的程序中使用计算着色器。我使用 C# 和 OpenTK 来使用着色器。我的问题:我所有的计算机都有 0 workGroupCount 和 0 workGroupSize。我用这个 OpenTK 代码得到这些值:

int workGroupCount = GL.GetInteger((GetPName)All.MaxComputeWorkGroupCount);
int workGroupSize = GL.GetInteger((GetPName)All.MaxComputeWorkGroupSize);
int workGroupInvocations = GL.GetInteger((GetPName)All.MaxComputeWorkGroupInvocations);
Run Code Online (Sandbox Code Playgroud)

Vertex、Fragment 和 Tesselation 着色器在我的计算机上运行良好。OpenGL 4.3 及以上版本。为什么我有 0 个工作组计数?

Rob*_*ani 5

根据该文件glGetGL_MAX_COMPUTE_WORK_GROUP_COUNT并且GL_MAX_COMPUTE_WORK_GROUP_SIZE应该通过的版本索引进行检索glGetIntegervglGetIntegeri_v

GL_MAX_COMPUTE_WORK_GROUP_COUNT

被 glGet 的索引版本接受。data 可以分派到计算着色器的最大工作组数。索引 0、1 和 2 分别对应于 X、Y 和 Z 维度。

GL_MAX_COMPUTE_WORK_GROUP_SIZE

被 glGet 的索引版本接受。data 计算着色器编译期间可能使用的工作组的最大大小。索引 0、1 和 2 分别对应于 X、Y 和 Z 维度。

在 OpenTK 中,这作为重载暴露GL.GetInteger在中间带有索引参数,因此您的调用应该是:

int workGroupCount = GL.GetInteger((GetPName)All.MaxComputeWorkGroupCount, 0);
int workGroupSize = GL.GetInteger((GetPName)All.MaxComputeWorkGroupSize, 0);
int workGroupInvocations = GL.GetInteger((GetPName)All.MaxComputeWorkGroupInvocations);
Run Code Online (Sandbox Code Playgroud)

如果您GL.GetError在每次调用 后检查GL.GetInteger,前两个可能会返回GL_INVALID_ENUM