自从理解矩阵计算并将它们映射到预期结果以来已经有一段时间了。这有点吓人。好奇是否有人已经完成了从 ImageView 矩阵android.graphics.Matrix
到 openGL 矩阵“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 顶部就好了。所以它可能是着色器。但是......我不能排除从图像矩阵输入的数据也破坏了纹理并将其表示为远离屏幕。我不知道用什么作为默认矩阵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 调用的函数的输入所操纵。