了解矩阵计算并将其映射到预期结果已经有一段时间了。这有点吓人。想知道是否有人完成了从 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};
恢复了图像。但是纹理不会通过 ImageTouchView 调用的 onMatrixChanged(Matrix matrix)
函数的输入进行操作。
最佳答案
如果您想平移图像(通过移动像素渲染器),您有两种选择。
翻译 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";
使用 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/