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

标签 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

出现以下错误:

cannot locate suitable resource to bind variable "instance_mat". Possibly large array.

问题是: GL_MAX_VERTEX_UNIFORM_VECTORS 是否返回所有类型数组的数量,无论它们的大小是什么?我的意思是,无论这个 float/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);


}

最佳答案

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

Implementation note: OpenGL implementations are allowed to reject shaders for implementation-dependent reasons. So you can have fewer active uniform components by your reckoning and still fail to link due to uniform limits. This is usually on hardware that is innately vector hardware. Pre-GeForce 8xxx hardware, and all ATi hardware does this. In this case, you should assume that each separate uniform takes up 4 components, much like it would in D3D. That means a "uniform float" is 4 components, a mat2x4 is 16 components (each row is 4 components), but a mat4x2 is 8 components.

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

关于opengl - GLSL float/vec3/vec4 数组最大大小 = GL_MAX_VERTEX_UNIFORM_VECTORS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20761237/

相关文章:

OpenGL:如何暂停着色器工作

java - 在 Pi 3 B+ 上使用 Processing Pi 的 GLSL 着色器

ios - GLSL:是否可以创建包含中心像素的单色区域的蒙版?

opengl - glActiveTexture 和 glBindTexture 的区别和关系

c++ - 如何使用着色器在 opengl es 中渲染四边形内的部分纹理

c++ - OpenGL,着色器模型 3.3 纹理 : Black Textures?

opengl - 四 strip 纹理失真

c++ - 如何在延迟着色中从光照几何体的内部进行绘制

c# - Monotouch OpenGL 类型和 Cocos2d

winapi - 在 Win32 OpenGL 中更新场景的正确方法是什么