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

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

问题描述

我跑步

glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect);

并获得1024.

比在GLSL中做

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实现拒绝 着色器基于实现的原因.所以你可以少 根据您的估算,活动的统一组件仍然无法链接 统一限制.通常在与生俱来的矢量硬件上 硬件. 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天全站免登陆