当我尝试链接我的几何着色器时,它会抛出以下错误:
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时,统一数据和其他类型的数据存在硬件限制。
最好将三角形数据放入顶点数组对象并使用它进行渲染,但如果出于某种原因,您希望每次调用着色器时都能获得三角形数据,则可以通过将顶点编码为纹理而不是统一数组来获得此功能,然后只从着色器内部的纹理中提取。
通常,纹理可以解决着色器调用之间需要大量恒定数据的问题。
请注意,您可以获得浮动纹理格式,这可能是用于顶点数据的格式。
您有几个选项:
- 将数据存储在顶点缓冲区对象中,并在顶点数组中指定顶点属性格式
- 将数据存储在1D纹理中。但这种方式受纹理大小限制,具体取决于您的显卡。使用glGetInteger(GL_MAX_TEXTURE_SIZE,&SIZE)进行检查;我的GT750M返回16384(以texel为单位)
- 若要存储超过上述限制的更多三角形数据,可以使用纹理缓冲区对象。它将纹素的数量扩展到数亿。使用glGetInteger检查图形卡上的限制(GL_MAX_TEXTURE_BUFFER_SIZE,&SIZE)