Glsl 理解依赖于实现的限制

Glsl 理解依赖于实现的限制,glsl,vertex-shader,Glsl,Vertex Shader,我的问题接近于这个 对他来说, 他有一个GL_MAX_VERTEX_UNIFORM_组件4096 他使用的是mat4[]数组 在64 mat4以下,着色器很好,在64 mat4以上,着色器不好 正如上面所写的,在amd卡上,为了获得正确的值,它应该除以4,这给了他4096/4=1024个浮点数 因为mat4是16个浮点数,所以他将其除以16,得到1024/16=64个mat4 因此,限制与他的使用是一致的 但这不是我的,这是我的: GL_最大_顶点_均匀_组件:16384 vec3数组

我的问题接近于这个

对他来说,

  • 他有一个GL_MAX_VERTEX_UNIFORM_组件4096
  • 他使用的是mat4[]数组
  • 在64 mat4以下,着色器很好,在64 mat4以上,着色器不好
正如上面所写的,在amd卡上,为了获得正确的值,它应该除以4,这给了他4096/4=1024个浮点数

因为mat4是16个浮点数,所以他将其除以16,得到1024/16=64个mat4

因此,限制与他的使用是一致的


但这不是我的,这是我的:

  • GL_最大_顶点_均匀_组件:16384
  • vec3数组
我使用向量来转换多维数据集的实例,因此向量的数量等于传递给glDrawArraysInstanced()的实例数量。 代码实际上只是
gl\u Position=vp*translateVec[gl\u InstaceID]*pos
(vp具有唯一的视图投影矩阵)。 如果矢量少于256,则立方体将正确转换。 在256个向量以上,前256个立方体是正常的,但所有其他立方体都不是,它们位于(0,0,0)点,看起来向量是(0,0,0)

我有一个AMD6490M,所以像他一样,我应该做4步分割 16384/4=4096个浮点数

维基说,由于矢量架构,“你应该假设每个单独的制服包含4个组件”。这意味着vec3将使用4个组件而不是3个组件

因此4096/4=1024 vec3

如你所见,这与我的观察不一致

我错过了什么? 还有GL_MAX_UNIFORM_向量呢(我是4096)


注意事项:我使用
glUniform3fv()
上传了vec3数组,并使用
uniform vec3[255]
Core profile 4.2,win7,13.1 catalyst声明了该数组。

是否有什么事情让您对该语句感到困惑:“OpenGL实现允许出于与实现相关的原因拒绝着色器。因此,通过计算,您可以拥有较少的活动统一组件,但由于统一限制,仍然无法链接。"? 着色器可能由于实现所需的任何原因而无法编译。如果它不喜欢256个项目的数组,那么它就不会编译它们。实际上,它编译和链接时没有警告。那么它仍然是一种实现选择吗?如果它编译并链接,你会遇到什么问题?是的,对不起,没有真正解释发生了什么。我使用这些向量来转换立方体的实例(通过gl_InstaceID)。前256个已正确转换,其他256个未转换,它们都位于(0,0,0)点。您是否考虑过使用统一数组而不是统一数组?顺便说一句,如果你正在制作雷霆战舰仿制品,不要渲染立方体。渲染对象的表面,而不是立方体。