マトリックスの計算を理解し、それらを期待される結果にマッピングしてから、かなりの時間が経ちました。それは一種の威圧的です。android.graphics.Matrix
その背後にある画像に基づいてテクスチャを更新するために、ImageView Matrix から openGL Matrix 'android.opengl.Matrix' へのマッピングを行った人がいる場合は興味深いです。
テクスチャのすぐ後ろには常に写真があり、前のテクスチャは ImageView (実際には ImageTouchView ライブラリを使用) と同じ縮尺と変換を維持する必要があります。ImageView のスケーリングとズームは、期待どおりに機能します。
そのため、イメージのサイズが変更されている間に、プロジェクト内の OpenGL ES 2.0 シェーダー コードを更新して、サイズが変更されるようにしたいと考えています。コールバックを使ってシェーダーコードを直接操作すればできると思っていたのですが、うまくいかないようです。これがシェーダーの問題なのか、直接のマトリックスの受け渡しの問題なのかはわかりません。マトリックスの変化が検出されると、ImageTouchView からトリガーに到達します。
@Override
public void onMatrixChanged(Matrix matrix)
{
photoViewRenderer_.updateTextureMatrix(matrix);
photoSurfaceView_.requestRender();
}
そのマトリックス データを受け取り、新しいマトリックスをテクスチャに表示しようとすると、ImageTouchView の上に黒い画面が表示されます。したがって、これはコード内の OpenGL の問題である可能性が非常に高くなります。ただし、記述されている内容を正確に確認できるように、これはどのように見えるかです。
シェーダーコードはこんな感じ。これらから始めて、フィードバックに基づいて要求に応じて追加のコードを追加します。
private final String vertexShader_ =
"uniform float zoom;\n" +
"attribute vec4 a_position;\n" +
"attribute vec4 a_texCoord;\n" +
"attribute vec3 a_translation;\n" +
"varying vec2 v_texCoord;\n" +
"void main() {\n" +
" gl_Position = a_position * vec4(a_translation, 1.0);\n" +
" v_texCoord = a_texCoord.xy * zoom;\n" +
"}\n";
行を追加する前はvec4(a_translation, 1.0);
、イメージが同じサイズの ImageTouchView の上に直接表示されているという点で、期待どおりに機能しているように見えました。したがって、それはおそらくシェーダーです。しかし... Image Matrix から入ってくるデータがテクスチャを台無しにし、画面から離れて表現していることを排除することはできません。a_translation
それをチェックするためのデフォルトのマトリックスとして何を使用すればよいかわかりません。
編集:
黒い画面は実際には問題ではありません。a_position
画像を元に戻すように設定されたデフォルトprivate float[] positionTranslationData_ = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
。しかし、テクスチャはonMatrixChanged(Matrix matrix)
、ImageTouchView によって呼び出された関数からの入力で操作されていません。