自从了解Matrix计算并将其映射到预期结果以来已经有一段时间了。这有点令人生畏。很奇怪是否有人从ImageView矩阵android.graphics.Matrix
映射到openGL矩阵'android.opengl.Matrix',以便根据它背后的图像更新纹理。
纹理后面总会有一张照片,前面的纹理应该与ImageView保持相同的比例和平移(实际上使用ImageTouchView库)。 ImageView缩放和缩放按预期和期望工作。
因此,在重新调整Image的大小时,我想更新项目中的OpenGL ES 2.0着色器代码,以便用它更改大小。我认为我可以通过使用回调和直接操作着色器代码来做到这一点,但它似乎没有工作。不确定这是着色器问题还是直接的Matrix传递问题。当检测到矩阵变化时,从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上面就好了。所以它可能是着色器。但是......我不能排除从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)
函数的输入不会对纹理进行操作。
答案 0 :(得分: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";
使用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'是相同的,依此类推,我认为不是什么你正试图存档。