iOS デバイスでは、属性をバインドするのが賢明ですか (また、バインド先のインデックス番号をどのように選択しますか)? 私のアプリケーションにはいくつかのシェーダーがあり、すべての属性/ユニフォームを追跡するのは面倒です。しかし、nVidia がインデックスに制限を課していることを読んだことがあり、それはglBindAttribLocation
一般的に避けるべきだと考えています。
質問する
1847 次
2 に答える
3
属性とユニフォームを管理する最良の方法は、列挙型を使用することであることがわかりました
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
これがあなたが本当に求めていたものかどうかはわかりませんが、それでもなお有用です。
于 2012-12-06T09:10:21.320 に答える
2
"しかし、nVidia がインデックスに制限を課していることを読みました"
あなたが話しているのはDesktop OpenGLのためのもので、これは OpenGL ES とは異なります。だからあなたには当てはまりません。
これは、デスクトップ GL でも正しくありません。NVIDIA がビルトイン属性とユーザー定義属性の間で違法にエイリアスを作成しているのは事実です。しかし、組み込み属性をまったく使用しない場合、それは関係ありません。そして、あなたはすべきではありません。したがって、そうでない場合でも、心配する必要はありません。
于 2012-12-06T09:16:00.000 に答える