glGetAttribLocation vs glBindAttribLocation

时间:2012-12-06 09:02:49

标签: ios opengl-es opengl-es-2.0

在iOS设备上绑定属性是明智的(如何选择要绑定的索引号)?在我的应用程序中,我有几个着色器,跟踪所有属性/制服变得很麻烦。但我已经在索引上读到了nVidia imposes restrictions,这让我觉得glBindAttribLocation一般应该避免。

2 个答案:

答案 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对索引施加限制

  1. 您所谈论的是 Desktop OpenGL ,它与OpenGL ES不同。所以它不适用于你。

  2. 即使桌面版GL也不正确。确实,NVIDIA在内置属性和用户定义属性之间进行非法别名。但如果您从不使用内置属性,则无关紧要。你不应该。所以如果你不这样做,就没什么可担心的了。