レンダースクリプトで作成されたアプリケーションからコードを移植することにより、OpenGL ES 2.0 Android アプリケーションを開発しています。renderscript では、この関数が使用されます。
float4 rsMatrixMultiply(rs_matrix4x4 *m, float3 in);
Javaを使用してOpenGLアプリケーションで使用する必要があるため、この関数が正確に何をし、どのように実装されているかを知っている人はいますか?
レンダースクリプトで作成されたアプリケーションからコードを移植することにより、OpenGL ES 2.0 Android アプリケーションを開発しています。renderscript では、この関数が使用されます。
float4 rsMatrixMultiply(rs_matrix4x4 *m, float3 in);
Javaを使用してOpenGLアプリケーションで使用する必要があるため、この関数が正確に何をし、どのように実装されているかを知っている人はいますか?
これは、行列 'm' とベクトル 'in' の間で標準的な行列乗算を行います。結果は「m」に戻されます。サイズ 3 のベクトルで 4x4 行列を乗算するために、この関数はベクトルが w 次元の値が 1 の float4 であるかのように動作します。
この関数に関するドキュメントについては、こちらをご覧ください: http://developer.android.com/reference/renderscript/rs__matrix_8rsh.html
以下は、AOSP の rs_core.c からの実際のコードです。
extern float4 __attribute__((overloadable))
rsMatrixMultiply(const rs_matrix4x4 *m, float3 in) {
float4 ret;
ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + m->m[12];
ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + m->m[13];
ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + m->m[14];
ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + m->m[15];
return ret;
}