OpenGL shader对uniform的数量是有限制的,可以通过以下几个属性获取对应的限制:
GL_MAX_UNIFORM_BLOCK_SIZE GL_MAX_GEOMETRY_UNIFORM_BLOCKS GL_MAX_VERTEX_UNIFORM_BLOCKS GL_MAX_FRAGMENT_UNIFORM_BLOCKS GL_MAX_UNIFORM_BLOCK_SIZE # 缓冲区的可用存储空间也有限制
但是我发现上边的这几个属性在gles2中并没有,因为项目使用的ndk r15c
Android NDK与OpenGL ES的对应关系如下:
- Android NDK r20及更早版本对应OpenGL ES 2.0。
- Android NDK r21及以后的版本对应OpenGL ES 3.0及更高版本。
那么很确定就是OpenGL es2了,又找到其他的几个属性:
属性 | Android |
最大支持的纹理图像单元数,可用于从顶点着色器和片段处理器组合访问纹理贴图 | _MAX_COMBINED_TEXTURE_IMAGE_UNITS |
支持的最大纹理图像单元,可用于从片段着色器访问纹理贴图。 | GL_MAX_TEXTURE_IMAGE_UNITS |
最大支持的纹理图像单元,可用于从顶点着色器访问纹理贴图 | GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS |
实际运行过程中发现
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: 96 GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: 16 GL_MAX_TEXTURE_IMAGE_UNITS: 16 GL_MAX_FRAGMENT_UNIFORM_VECTORS: 4096
glGetUniformLocation返回-1才是找不到,因为在shader中我们可以手动指定location,并且可以指定为0,所以这里也能反应出来0代表的不是找不到。
layout(location = 0) uniform mat4 projectionMatrix;
layout
关键字在OpenGL中用于指定着色器变量的布局属性。它通常与输入(顶点着色器)和输出(片段着色器)变量一起使用,并提供有关如何将数据传递给着色器的额外信息。
之前一直欢迎shader有dead code,或者shader没有use,或者glGetError报错了,实际上这写点都没有问题。