GLSL float/vec3/vec4 数组最大大小 = GL_MAX_VERTEX_UNIFORM_VECTORS? [英] GLSL float/vec3/vec4 array max size = GL_MAX_VERTEX_UNIFORM_VECTORS?

查看:42
本文介绍了GLSL float/vec3/vec4 数组最大大小 = GL_MAX_VERTEX_UNIFORM_VECTORS?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我跑

glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect);

得到 1024.

比在 GLSL 中我做的

Than in GLSL I do

uniform mediump vec4[1020] instance_mat

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

and that was ok. But with vec3/vec2/float it fails:

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".可能是大数组.

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

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

The question is: Does GL_MAX_VERTEX_UNIFORM_VECTORS return the number of all kind of arrays, no matter what size they are? I mean, no matter does this float/vec2/vec3/vec4 - all counts as one VERTEX_UNIFORM_VECTOR?

顶点着色器代码,原样:

Vertex shader code, as is:

#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(实施限制):

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

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)

Which is my case, also. But it not has to be always like that. Of course, for compatible reasons it is always better to count each float/vec2/vec3 uniform value, as max size value (vec4)

这篇关于GLSL float/vec3/vec4 数组最大大小 = GL_MAX_VERTEX_UNIFORM_VECTORS?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆