Opengl GLSL float/vec3/vec4数组最大大小=GL_max_顶点_均匀_向量?

Opengl GLSL float/vec3/vec4数组最大大小=GL_max_顶点_均匀_向量?,opengl,glsl,Opengl,Glsl,我跑 得到1024 比在GLSL我更喜欢 glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect); 没关系。但使用vec3/vec2/float时失败: uniform mediump vec4[1020] instance_mat 出现以下错误: 找不到合适的资源来绑定变量“instance\u mat”。 可能是大型阵列 问题是: GL_MAX_VERTEX_UNIFORM_向量是否返回所有类型数组的数

我跑

得到1024

比在GLSL我更喜欢

glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect);
没关系。但使用vec3/vec2/float时失败:

uniform mediump vec4[1020] instance_mat
出现以下错误:

找不到合适的资源来绑定变量“instance\u mat”。 可能是大型阵列

问题是: GL_MAX_VERTEX_UNIFORM_向量是否返回所有类型数组的数量,无论它们的大小如何?我的意思是,不管这个float/vec2/vec3/vec4-都算作一个吗 顶点一致向量


顶点着色器代码,如下所示:

uniform mediump float[1030] instance_mat;          // fails
//uniform mediump vec2[1030] instance_mat;         // and this
//uniform mediump vec3[1030] instance_mat;         // and this
这句话就说明了一切

GL\u MAX\u VERTEX\u UNIFORM\u向量


数据返回一个值,即顶点着色器的统一变量存储中可能保存的4个向量的最大数量。GL_MAX_VERTEX_UNIFORM_向量的值等于GL_MAX_VERTEX_UNIFORM_分量的值,并且必须至少为256

因此,这意味着,无论类型如何,您都只能保存长度为max
GL\u max\u VERTEX\u UNIFORM\u VECTORS
的数组。即使
vec4==4浮动

当然,最大值因不同的硬件实现以及OpenGL的单个图形卡的新旧程度而异。

根据(实现限制):

实现说明:允许OpenGL实现拒绝 着色器用于实现相关的原因。所以你可以少吃点 根据您的计算,活动制服组件仍然无法链接 达到统一的限度。这通常是在天生具有向量的硬件上实现的 硬件。Pre-GeForce 8xxx硬件,所有ATi硬件都会这样做。 在这种情况下,您应该假设每件单独的制服占4% 组件,就像在D3D中一样。这意味着一个“均匀浮动” 是4个组件,mat2x4是16个组件(每行4个 组件),但mat4x2是8个组件

这也是我的情况。但它不必总是这样。
当然,出于兼容的原因,最好将每个float/vec2/vec3统一值计算为最大大小值(vec4)

,这是您引用的GLSL ES规范。在这个问题上,它有桌面GLSL的一半要求<代码>常量整数gl_MaxVertexUniformVectors=256在desktop GLSL.@AndonM.Coleman中谢谢你的评论,我想我发布得有点太快了,但现在已经修复了。另外,我不相信在线手册页面,因为这些信息显然是错误的。如果您阅读第117页(7.6统一变量)上的,它与实现定义常量的值与
GL\u MAX\u统一向量\u组件
相同的说法相矛盾。GLSL规范与OpenGL 4.4规范一致,因此我对该手册页面上任何内容的准确性都有严重怀疑,特别是因为上面第1行列出的值是1024,而不是256。@Tower120:是的,但此答案中的信息不正确。这不是Vallentin的错,只是在OpenGL规范中误解这句话来创建该页面的人:“与实现相关的常数MAX_VERTEX_UNIFORM_VECTORS和MAX_FRAGMENT_UNIFORM_VECTORS的值分别等于MAX_VERTEX_UNIFORM_组件和MAX_FRAGMENT_UNIFORM_组件的值除以四。“页面实际上应该说,
GL\u MAX\u VERTEX\u UNIFORM\u VECTORS
等于
GL\u MAX\u VERTEX\u UNIFORM\u COMPONENTS
的值除以四。@tower120:我知道你说的是
vec3
。但是当OpenGL谈到包含单词
VECTOR
的限制时,它的意思是
vec4
。这适用于顶点属性、制服等。例如,
mat4
变量与4个向量(或总共16个组件)具有相同的存储要求。因此,尽管Valentin的回答暗示你最多可以拥有1024套不正确的
mat4
制服,但你被限制为256套
mat4
s,因为
mat4
=4x
vec4
。您需要遵守的实际限制是
MAX\u VERTEX\u UNIFORM\u COMPONENTS
。GL\u MAX\u VERTEX\u UNIFORM\u COMPONENTS返回约16000。我有nVidia,不是ATI。所以我认为这是真的你能展示你的整个着色器吗?我认为这里有一些混乱,并且被接受的答案中的信息是不正确的
GL_MAX_VERTEX_UNIFORM_VECTORS
指顶点着色器阶段中所有活动制服的最大大小总和。如果您有其他制服,您可以支持的阵列的最大长度将更小。感谢您更新您的问题。现在,您的问题实际上是您正在使用的GLSL版本。在GLSL 1.20中没有
GL\u MAX\u VERTEX\u UNIFORM\u VECTORS
。您所拥有的只是
GL\u MAX\u VERTEX\u UNIFORM\u组件
。在GLSL中,该常量可由以下内容引用:
gl_MaxVertexUniformComponents
,其最小实现限制为512。在顶点着色器中使用1200+16个均匀组件(1200个用于阵列,16个用于mat4)。尝试按照以下方式声明一些内容:
uniformmediumpfloat instance_mat[gl_MaxVertexUniformComponents-16]如果您试图创建统一数组,那么您的数组下标也位于声明的错误部分。“统一mediump float instance_mat[gl_MaxVertexUniformComponents-16];”-相同的错误。我相信这是相关的:
#version 120
uniform mediump float[1200] instance_mat;        //mat4x3
attribute mediump float instaceIdF;             // in range 0..1000 Will be converted to int

attribute mediump vec3 vertex_;
attribute lowp vec4 color;
uniform mediump mat4 matrix;
varying lowp vec4 v_color;

void main(void)
{
    v_color = color;


        int instaceId = int(instaceIdF) * 12;
        mediump mat4 offsetMat = mat4(
                                    vec4(instance_mat[instaceId],   instance_mat[instaceId+1], instance_mat[instaceId+2], 0),
                                    vec4(instance_mat[instaceId+3], instance_mat[instaceId+4], instance_mat[instaceId+5], 0),
                                    vec4(instance_mat[instaceId+6], instance_mat[instaceId+7], instance_mat[instaceId+8], 0),
                                    vec4(instance_mat[instaceId+9], instance_mat[instaceId+10], instance_mat[instaceId+11], 1)
                                 );

        /*mediump mat4 offsetMat = mat4(
                                    vec4(instance_mat[instaceId].xyz, 0),
                                    vec4(instance_mat[instaceId+1].xyz, 0),
                                    vec4(instance_mat[instaceId+2].xyz, 0),
                                    vec4(instance_mat[instaceId+3].xyz, 1)
                                 );*/
        gl_Position = matrix * offsetMat * vec4(vertex_, 1.0);
        //gl_Position = matrix * vec4(vertex, 1.0);


}