我跑
glGetIntegerv(GL_MAX_VERTEX_UNIFORM_VECTORS, &maxVertUniformsVect);
Run Code Online (Sandbox Code Playgroud)
得到1024.
比我在GLSL做的
uniform mediump vec4[1020] instance_mat
Run Code Online (Sandbox Code Playgroud)
那没关系.但是使用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
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
无法找到合适的资源来绑定变量"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);
}
Run Code Online (Sandbox Code Playgroud)
根据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)
| 归档时间: |
|
| 查看次数: |
11029 次 |
| 最近记录: |