我的问题接近这个问题ATI 显卡上 GLSL 着色器的顶点统一组件的实际数量是多少?
在他的情况下,
- 他的 GL_MAX_VERTEX_UNIFORM_COMPONENTS 为 4096
- 他正在使用 mat4[] 数组
- 低于64 mat4,shader很好,高于,不是
正如wiki 上写的那样,在 AMD 卡上,要获得正确的值,它应该除以 4,这给了他 4096/4 = 1024 个浮点数。
由于 mat4 是 16 个浮点数,因此他将其除以 16,得到 1024/16 = 64 mat4。
所以限制与他的使用是一致的。
但这不是我的,这就是我所拥有的:
- GL_MAX_VERTEX_UNIFORM_COMPONENTS:16384
- vec3 数组
我正在使用向量来转换立方体的实例,因此向量的数量等于传递给 glDrawArraysInstanced() 的实例数量。代码真的很简单gl_Position = vp * translateVec[gl_InstaceID] * pos
(使用 vp 一个独特的 ViewProjection 矩阵)。如果向量少于 256 个,则立方体被正确平移。在 256 个向量之上,前 256 个立方体是可以的,但其他的都不是,它们位于 (0, 0, 0) 点,看起来向量是 (0, 0, 0)。
我有一个 AMD 6490m 和他一样,我应该按 4 步 16384/4 = 4096 浮点数进行除法
wiki 说,由于矢量架构,“您应该假设每个单独的制服占用 4 个组件”。这意味着 vec3 将使用 4 个组件而不是 3 个。
所以 4096/4 = 1024 vec3
如您所见,这与我的观察不一致。
我错过了什么?还有 GL_MAX_UNIFORM_VECTORS (对我来说是 4096)呢?
注意:我上传了 vec3 数组,并使用Core profile 4.2、win7、13.1 催化剂glUniform3fv()
声明了该数组。uniform vec3[255]