在iOS设备上绑定属性是明智的(如何选择要绑定的索引号)?在我的应用程序中,我有几个着色器,跟踪所有属性/制服变得很麻烦。但我已经在索引上读到了nVidia imposes restrictions,这让我觉得glBindAttribLocation
一般应该避免。
答案 0 :(得分:2)
我发现管理属性和制服的最佳方法是使用枚举
enum
{
UNIFORM_MODELVIEWPROJECTION_MATRIX,
UNIFORM_NORMAL_MATRIX,
UNIFORM_VEC3_lightPosition,
UNIFORM_VEC4_lightDiffuseColour,
UNIFORM_VEC4_lightSpecularColour,
UNIFORM_VEC4_lightAmbientColour,
UNIFORM_VEC3_lightHalfVector,
UNIFORM_Texture,
UNIFORM_VEC4_NumberColour,
UNIFORM_VEC4_FaceColour,
UNIFORM_VEC4_camerPosition,
NUM_UNIFORMS
};
GLint uniforms[NUM_UNIFORMS];
然后当你初始化着色器时
// Get uniform locations.
uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX] = glGetUniformLocation(Program, "modelViewProjectionMatrix");
uniforms[UNIFORM_NORMAL_MATRIX] = glGetUniformLocation(Program, "normalMatrix");
uniforms[UNIFORM_VEC3_lightPosition] = glGetUniformLocation(Program, "lightPosition");
//etc
然后使用它们
glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, modelViewProjectionMatrix.m);
glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, normalMatrix.m);
//etc
不确定这是否是你真正要求的,但它的用处一点也不少。
答案 1 :(得分:2)
“但我读过nVidia对索引施加限制”
您所谈论的是 Desktop OpenGL ,它与OpenGL ES不同。所以它不适用于你。
即使桌面版GL也不正确。确实,NVIDIA在内置属性和用户定义属性之间进行非法别名。但如果您从不使用内置属性,则无关紧要。你不应该。所以如果你不这样做,就没什么可担心的了。