我跑
glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect);得到1024。
比在GLSL做的更好
uniform mediump vec4[1020] instance_mat那也没问题。但是,对于vec3 3/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 2/vec2 3/vec2 4--都算作一个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);
}发布于 2013-12-25 17:02:06
根据28 28GLSL%29 (实现限制):
实现注意:由于与实现相关的原因,允许OpenGL实现拒绝着色器。因此,您可以有较少的有效制服组件,通过您的计算,仍然没有链接,因为统一的限制。这通常是在硬件上,这是天生的矢量硬件。前GeForce 8 8xxx硬件和所有ATi硬件都是这样做的。在这种情况下,您应该假设每个单独的制服包含4个组件,就像在D3D中一样。这意味着--“统一浮动”是4个组件,mat2x4是16个组件(每行是4个组件),而mat4x2是8个组件。
这也是我的案子。但不一定总是这样。当然,出于兼容的原因,最好将每个浮点数/向量2/向量3统一值计算为最大大小值(vec4)。
发布于 2013-12-24 14:45:27
OpenGL文档说了这一切。
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的旧/新。
https://stackoverflow.com/questions/20761237
复制相似问题