OpenGL ES纹理图集失真

询问

我正在尝试使用纹理图集和特定的着色器平铺区域,但是在不同的设备上却出现了奇怪的行为。

它们中的大多数(三星Galaxy Ace,三星Galaxy Gio等)都可以,只是出现了出血(希望我可以用半像素校正来修复它)。

但是三星Galaxy S3距离遥遥领先:

屏幕截图

(似乎也从较弱的变形区域跳到了甚至更糟的变形区域,这恰好发生在规则的图集宽度或高度通过时)

  • 使用OpenGL ES 2.0,Android SDK。
  • 用于平铺的图集和纹理部分均为POT(图集为1024,纹理部分为64)。
  • 纹理过滤并不重要:同时尝试了NEARESTLINEAR
  • 使用drawable-nodpi资源文件夹
  • mat4,vec2,vec4,sampler2D精度更改无济于事

我究竟做错了什么?有可能修复它吗?

着色器:

顶点:

    uniform mat4 u_viewmatrix;
    uniform mat4 u_modelmatrix;

    attribute vec4 a_position;

    varying vec2 v_texCoord;

    void main()
    {
        mat4 matrix = u_viewmatrix * u_modelmatrix;
        gl_Position = matrix * a_position;

        v_texCoord = a_position.xy;
    }

分段:

    precision highp float;

    uniform sampler2D u_texture;
    uniform float u_texpartx;
    uniform float u_texparty;
    uniform float u_texpartwidth;
    uniform float u_texpartheight;
    uniform float u_texwidth;
    uniform float u_texheight;
    varying vec2 v_texCoord;

    void main()
    {
        vec2 coord;

        coord.x = (u_texpartx + mod(v_texCoord.x, u_texpartwidth))/u_texwidth;
        coord.y = (u_texparty + mod(v_texCoord.y, u_texpartheight))/u_texheight;

        gl_FragColor = texture2D(u_texture, coord);
    }
考克拉宁

将图片放在中/assets,而不是中/res/drawable-nodpi我将所有内容放入其中,/assets并且以任何其他方式的PNG缩放,优化或失真都没有问题。

相关问题:Android应用程序通过缩放从/ drawables-nodpi /加载图像

但是,您应该检查位图的尺寸。如果以适当的大小加载,则问题不在缩放的位图中。

另外,我建议您更新着色器-您应该将偏移量传递给顶点着色器,然后将最终坐标传递给片段着色器。它们可以正确插值,但是片段着色器中的计算量要少得多(这也可能会影响某些硬件的精度)。

最终,您根本不应该在着色器中进行此类计算-而是在Java代码中执行此数学运算,而只是将采样器的最终坐标传递到着色器中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章