大型阵列的几何着色器错误

Error in Geometry Shader from large array

当我尝试 link 我的几何着色器时,它抛出以下错误:

0(76) : error C5041: cannot locate suitable resource to bind variable "triTable". Possibly large array.

引用在着色器中声明的数组:

    const int triTable[256][16] =
    { { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
    { 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
    { 0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 },
    ...
    ...
    ...
    { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } };

数组很大。这是否与数组太大而无法在着色器中声明有关,还是存在其他问题?

三角形数据不应该是常量(或统一)。

是的,数据太大,无法放入数组。使用 OpenGL 时,统一数据和其他类型的数据存在硬件限制。

您最好将三角形数据放入顶点数组对象并使用它进行渲染,但如果出于某种原因您希望每次调用着色器时都可以使用三角形数据,您可以通过对顶点进行编码来获得此功能放入 纹理 而不是统一数组,然后只需从着色器内的纹理中获取。

一般来说,纹理解决了在着色器调用之间需要大量常量数据的问题。

请注意,您可以获得浮动纹理格式,这可能是您用于顶点数据的格式。

您有多种选择:

  1. 将数据存储在顶点缓冲区对象中,并在顶点数组中指定顶点属性格式。
  2. 将您的数据存储在一维纹理中。但是这种方式受纹理大小限制,具体取决于您的显卡。使用 glGetInteger(GL_MAX_TEXTURE_SIZE, &size); 检查它我的 GT750M returns 16384(纹素)
  3. 如果您想存储超过上述限制的更多三角形数据,您可以求助于texture buffer object。它将纹素的数量扩展到数亿。使用 glGetInteger(GL_MAX_TEXTURE_BUFFER_SIZE, &size);
  4. 检查它对你的显卡的限制