1

自从理解矩阵计算并将它们映射到预期结果以来已经有一段时间了。这有点吓人。好奇是否有人已经完成了从 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 调用的函数的输入所操纵。

4

1 回答 1

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";
    

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

可能导致您出现问题的一个原因是,现在,您的代码是一个乘法组件,它将 a_position.x 乘以 a_translation.x 组件,对于“y”等也是如此,我认为这不是您正在尝试的归档。

于 2013-05-13T15:50:27.453 回答