大型数组中的几何体着色器出错



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

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. 将数据存储在1D纹理中。但这种方式受纹理大小限制,具体取决于您的显卡。使用glGetInteger(GL_MAX_TEXTURE_SIZE,&SIZE)进行检查;我的GT750M返回16384(以texel为单位)
  3. 若要存储超过上述限制的更多三角形数据,可以使用纹理缓冲区对象。它将纹素的数量扩展到数亿。使用glGetInteger检查图形卡上的限制(GL_MAX_TEXTURE_BUFFER_SIZE,&SIZE)

相关内容

  • 没有找到相关文章

最新更新