Android ImageView矩阵到纹理矩阵

时间:2013-05-13 15:07:39

标签: android opengl-es android-imageview

自从了解Matrix计算并将其映射到预期结果以来已经有一段时间了。这有点令人生畏。很奇怪是否有人从ImageView矩阵android.graphics.Matrix映射到openGL矩阵'android.opengl.Matrix',以便根据它背后的图像更新纹理。

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

Order of the layout for the project

因此,在重新调整Image的大小时,我想更新项目中的OpenGL ES 2.0着色器代码,以便用它更改大小。我认为我可以通过使用回调和直接操作着色器代码来做到这一点,但它似乎没有工作。不确定这是着色器问题还是直接的Matrix传递问题。当检测到矩阵变化时,从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上面就好了。所以它可能是着色器。但是......我不能排除从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};会将图片恢复原状。但是,使用ImageTouchView调用的onMatrixChanged(Matrix matrix)函数的输入不会对纹理进行操作。

1 个答案:

答案 0 :(得分:1)

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

  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";
    
  3. 如果要移动纹理(不是四边形或正在渲染的任何内容),可以将相同的逻辑应用于v_texCoord。这将对输出纹理坐标应用平移和/或旋转。

    你问题的一个原因可能就是现在,你的代码是一个乘法组件,它将a_position.x乘以a_translation.x组件,对于'y'是相同的,依此类推,我认为不是什么你正试图存档。