OpenGL ES纹理图集失真

时间:2014-02-25 20:01:52

标签: java android opengl-es textures opengl-es-2.0

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

他们中的大多数(三星Galaxy Ace,三星Galaxy Gio等)都没问题,只是出血(希望我能用半像素校正来修复它)。

三星Galaxy S3 接下来的距离是:

Screenshots

(似乎也从较弱到最差的失真区域跳跃,它恰好发生在正常的图集宽度或高度传递上)

  • 使用OpenGL ES 2.0,Android SDK。
  • 用于平铺的图集和纹理部分都是POT(地图集为1024,纹理部分为64)。
  • 纹理过滤并不重要:尝试了 NEAREST LINEAR
  • 使用
  • 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);
    }

1 个答案:

答案 0 :(得分:1)

将图片放在/assets,而不是/res/drawable-nodpi。我将所有内容放在/assets中,并且在使用任何其他PNG格式缩放,优化或扭曲时都没有问题。

相关问题:Android app loading images from /drawables-nodpi/ with scaling

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

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

最终,您不应该在着色器中进行此类计算 - 而是在Java代码中进行此算法,并将采样器的最终坐标传递到着色器。