GLSL float / vec3 / vec4数组最大大小= GL_MAX_VERTEX_UNIFORM_VECTORS?

时间:2013-12-24 12:47:24

标签: opengl glsl

我跑

glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect);

并获得1024。

比我在GLSL中做的

uniform mediump vec4[1020] instance_mat

那没关系。但是使用vec3 / vec2 / float它失败了:

uniform mediump float[1030] instance_mat;          // fails
//uniform mediump vec2[1030] instance_mat;         // and this
//uniform mediump vec3[1030] instance_mat;         // and this

出现以下错误:

  

找不到合适的资源来绑定变量“instance_mat”。   可能是大阵列。

问题是: GL_MAX_VERTEX_UNIFORM_VECTORS是否返回所有类型的数组,无论它们的大小是多少?我的意思是,无论这个浮动/ vec2 / vec3 / vec4 - 都算作一个 VERTEX_UNIFORM_VECTOR?


顶点着色器代码,原样:

#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);


}

2 个答案:

答案 0 :(得分:6)

根据http://www.opengl.org/wiki/Uniform_%28GLSL%29(实施限制):

  

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

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

答案 1 :(得分:2)

OpenGL Docs说明了一切。

GL_MAX_VERTEX_UNIFORM_VECTORS

  

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

因此,这意味着无论类型如何,您只能保存长度为GL_MAX_VERTEX_UNIFORM_VECTORS的数组。即使vec4 == 4 floats

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