Android ImageView 矩阵到纹理矩阵

标签 android opengl-es android-imageview

了解矩阵计算并将其映射到预期结果已经有一段时间了。这有点吓人。想知道是否有人完成了从 ImageView 矩阵 android.graphics.Matrix 到 openGL 矩阵“android.opengl.Matrix”的映射,以便根据其背后的图像更新纹理.

在纹理的正后方总是会有一张照片,前面的纹理应该与 ImageView(实际上使用 ImageTouchView 库)保持相同的比例和平移。 ImageView 缩放和缩放按预期和期望工作。

Order of the layout for the project

因此,在调整图像大小时,我想更新项目中的 OpenGL ES 2.0 着色器代码,使其大小随之改变。我以为我可以通过使用回调并直接操作着色器代码来做到这一点,但它似乎并没有奏效。不确定这是着色器问题还是直接矩阵传递问题。当检测到矩阵变化时,从 ImageTouchView 到达触发器。

@Override
public void onMatrixChanged(Matrix matrix)
{
    photoViewRenderer_.updateTextureMatrix(matrix);
    photoSurfaceView_.requestRender();
}

当我收到该矩阵数据并尝试在纹理中显示新矩阵时,我在 ImageTouchView 上方看到黑屏。所以,这很可能只是代码中的 OpenGL 问题。然而,这就是它的样子,因为我们可以准确地看到所描述的内容。

What happens to the texture when implementing a matrix over it in Shader code.

着色器代码看起来像这样。我将从这些开始,并根据反馈要求添加额外的代码。

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}; 恢复了图像。但是纹理不会通过 ImageTouchView 调用的 onMatrixChanged(Matrix matrix) 函数的输入进行操作。

最佳答案

如果您想平移图像(通过移动像素渲染器),您有两种选择。

  1. 翻译 gl_Position:

    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" + // Note the + here
        "  v_texCoord = a_texCoord.xy * zoom;\n" +
        "}\n";
    
  2. 使用 4x4 矩阵对 gl_Position 应用仿射变换(请注意 a_position 的第 4 个分量必须为 1.0):

     private final String vertexShader_ =
        "uniform float zoom;\n" +
        "attribute vec4 a_position;\n" +
        "attribute vec4 a_texCoord;\n" +
        "attribute mat4 a_translation;\n" +
        "varying vec2 v_texCoord;\n" +
        "void main() {\n" +
        "  gl_Position = a_position*a_translation;\n" + 
        "  v_texCoord = a_texCoord.xy * zoom;\n" +
        "}\n";
    

如果你想移动纹理(不是四边形或你正在渲染的任何东西),你可以将相同的逻辑应用于 v_texCoord。这将对输出纹理坐标应用平移和/或旋转。

您遇到问题的一个原因可能是现在,您的代码是乘以组件的明智之举,它将 a_position.x 乘以 a_translation.x 组件,“y”也是如此,依此类推,我认为这不是什么您正在尝试存档。

关于Android ImageView 矩阵到纹理矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525338/

相关文章:

android - 将 map globe Rajawali 实现到 fragment Android

ios - OpenGL ES 1.1 - Alpha 蒙版

Android:如何在同一个 fragment 着色器中使用 samplerExternalOES 和 sampler2D

android - Instagram的心形动画模仿——FadeScale动画

android - 如何在 Android 中的特定点触摸时在 imageview 上绘制圆圈

android - ImageView 不能在大屏幕设备上缩放

android - 以编程方式在操作栏中的一项下打开列表菜单

android - 两个并排的 TextView 的引力

android - 如何解决android中的OutOfMemoryError?

java - 使用 glDrawTexiOES 时旋转纹理