Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android.grapics.matrix到OpenGL 2.0 ES纹理翻译大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
目前,该应用程序显示一个成功缩放和平移屏幕的 ImageView.在该图像的顶部,我想提供一种纹理,当它下方的图像缩放或平移时,我想更新自己以进行缩放或平移.

据我所知,这应该可以在ImageView上使用我当前设置的getImageMatrix(),然后将其应用于原始图像顶部的纹理位图.@H_607_7@

编辑&解决方案:(以下所选答案的强力助手)@H_607_7@

目前,纹理中的平移以与ImageView不同的速度发生,但是当解析后,我将使用其他编辑更新此发布,并为整个应用程序提供解决方案.然后只剩下解决方案和快速问题描述段落.也许我甚至会发布一个表面视图和渲染器源代码,以便使用可缩放的表面视图.@H_607_7@

为了完成ImageView到OpenGL纹理的映射,为了正确地完成这一点,需要做一些事情.希望这将有助于其他可能希望在未来使用可缩放SurfaceView的人.@H_607_7@

着色器代码如下所示. gl_FragColor从任何ImageView的getImageMatrix获取3×3的转换矩阵,以便从onDraw()方法中更新屏幕.@H_607_7@

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

private final String fragmentShader_ =
        "precision mediump float;\n" +
        "varying vec2 v_texCoord;\n" +
        "uniform sampler2D texture;\n" +
        "uniform mat3 transform;\n" +
        "void main() {\n" +
        "  vec2 uv = (transform * vec3(v_texCoord,1.0)).xy;\n" +
        "  gl_FragColor = texture2D( texture,uv );\n" +
        "}\n";

在开始时,OpenGL的转换矩阵只是一个识别矩阵,我们的ImageView将通过监听器使用着色器更新这些共享值.@H_607_7@

private float[] translationMatrix = {1.0f,0.0f,1.0f,1.0f};
...
uniforms_[TRANSLATION_UNIFORM] = glGetUniformLOCATIOn(program_,"transform");
checkGlError("glGetUniformLOCATIOn transform");
if (uniforms_[TRANSLATION_UNIFORM] == -1) {
    throw new RuntimeException("Could not get uniform LOCATIOn for transform");
}
....
glUniformMatrix3fv(uniforms_[TRANSLATION_UNIFORM],1,false,FloatBuffer.wrap(translationMatriX));
....

但是,OpenGL代码需要来自Android的OpenGL矩阵计算的反转,以及在将它们传递给渲染器以便在屏幕上显示之前对它们执行的转置操作.这与存储该信息的方式有关.@H_607_7@

protected void onMatrixChanged()
{
    //...
    float[] matrixValues = new float[9];
    Matrix imageViewMatrix = getImageViewMatrix();
    Matrix invertedMatrix = new Matrix();
    imageViewMatrix.invert(invertedMatriX);
    invertedMatrix.getValues(matrixValues);
            transpose(matrixValues);
    matrixChangedlistener.onTranslation(matrixValues);
    //...
}

除了输入OpenGL渲染器的值位于错误的位置之外,我们还遇到的问题是我们在imageHeight和imageWidth的范围内处理我们的翻译而不是标准化的[0,1]范围OpenGL期待.因此,为了纠正这一点,我们必须使用宽度和高度的可分数来定位最后一列.@H_607_7@

@H_515_17@matrixValues[6] = matrixValues[6] / getImageWidth(); matrixValues[7] = matrixValues[7] / getImageHeight();

然后,在完成此操作后,您可以使用ImageView矩阵函数或更新的ImageTouchView矩阵函数(在Android上处理图像时具有一些其他不错的功能)开始映射.@H_607_7@

效果可以在下面看到,其背后的ImageView占据整个屏幕,并且基于ImageView的更新更新它前面的纹理.这可以处理两者之@L_489_22@缩放和平移.@H_607_7@

此过程中唯一的另一个步骤是更改SurfaceView的大小以匹配ImageView的大小,以便用户放大时获得全屏体验.为了只显示一个表面视图,您可以简单地放置在背景中背后的“隐形”图像视图.只需让ImageTouchView更新就可以改变OpenGL SurfaceView的显示方式.@H_607_7@

在下面的答案中投票,因为他们帮助我通过聊天显着离线,以了解在将imageview与纹理链接时需要做些什么.他们应得的.@H_607_7@

如果您最终使用下面的顶点着色器修改,而不是碎片着色器分辨率,那么似乎不再需要将值反转为与缩放缩放一起使用(并且实际上如果离开它则向后工作)原样).此外,平移似乎也比预期的那样倒退.@H_607_7@

解决方法

您可以伪造片段着色器,只需将此矩阵设置为片段阴影的统一参数,并使用此矩阵修改纹理坐标.

precision mediump float;
uniform   sampler2D   samp;
uniform   mat3        transform;
varying   vec2        texCoord;

void main()
{
   vec2 uv = (transform * vec3(texCoord,1.0)).xy;
   gl_FragColor = texture2D(samp,uv);
}

请注意,从图像视图获得的矩阵是行主要顺序,您应该将其转换为获得OpenGL列主要顺序,您也可以分别按宽度和高度划分x和y平移分量.@H_607_7@

更新:我刚刚发现修改顶点着色器会更好,你可以用你在片段着色器中使用的相同矩阵来缩放你的四边形,如果它变大就会被屏蔽你的屏幕上,它就不会有问题边缘钳位小时,矩阵乘法只发生4次而不是每个像素一次.只需在顶点着色器中执行:@H_607_7@

gl_Position = vec4((transform * vec3(a_position.xy,1.0)).xy,0.0,1.0);

并在片段着色器中使用未转换的texCoord.@H_607_7@

大佬总结

以上是大佬教程为你收集整理的android.grapics.matrix到OpenGL 2.0 ES纹理翻译全部内容,希望文章能够帮你解决android.grapics.matrix到OpenGL 2.0 ES纹理翻译所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。