2

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

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 } };

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

4

2 回答 2

3

三角形数据并不意味着是常量(或制服)。

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

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

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

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

于 2015-03-26T01:42:19.407 回答
0

你有几个选择:

  1. 将数据存储在顶点缓冲区对象中,并在顶点数组中指定顶点属性格式。
  2. 将数据存储在 1D 纹理中。但是这种方式会受到纹理大小的限制,具体取决于您的显卡。使用 glGetInteger(GL_MAX_TEXTURE_SIZE, &size); 检查它 我的 GT750M 返回 16384(以纹素为单位)
  3. 如果你想存储更多超出上述限制的三角形数据,你可以求助于纹理缓冲区对象。它将纹素的数量扩展到数亿。使用 glGetInteger(GL_MAX_TEXTURE_BUFFER_SIZE, &size); 检查它对显卡的限制
于 2015-03-27T18:04:27.553 回答