【问题标题】:Error in Geometry Shader from large array大型阵列中的几何着色器错误
【发布时间】:2023-04-10 12:32:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: arrays opengl glsl shader marching-cubes


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这不是三角形数据,它是行进立方体算法的查找表。不过,这个建议还是不错的。谢谢。
    【解决方案2】:

    您有多种选择:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多