Java OpenGL ES纹理图谱失真

Java OpenGL ES纹理图谱失真,java,android,opengl-es,textures,opengl-es-2.0,Java,Android,Opengl Es,Textures,Opengl Es 2.0,我试图用纹理图集和特定的着色器来平铺区域,但我在不同的设备上得到了奇怪的行为 大多数(三星Galaxy Ace、三星Galaxy Gio等)都还可以,只是出血了(希望我能用半像素校正来修复) 但三星Galaxy S3在距离方面排名第二: (从较弱的畸变区跳到更差的畸变区似乎也是如此,它正好发生在常规的阿特拉斯宽度或高度传递上) 使用OpenGL ES 2.0、Android SDK 用于平铺的图集和纹理部分都是POT(图集为1024,纹理部分为64) 纹理过滤不重要:尝试了最近和线性过滤 使

我试图用纹理图集和特定的着色器来平铺区域,但我在不同的设备上得到了奇怪的行为

大多数(三星Galaxy Ace、三星Galaxy Gio等)都还可以,只是出血了(希望我能用半像素校正来修复)

但三星Galaxy S3在距离方面排名第二:

(从较弱的畸变区跳到更差的畸变区似乎也是如此,它正好发生在常规的阿特拉斯宽度或高度传递上)

  • 使用OpenGL ES 2.0、Android SDK
  • 用于平铺的图集和纹理部分都是POT(图集为1024,纹理部分为64)
  • 纹理过滤不重要:尝试了最近和线性过滤
  • 使用可绘制的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);
    }
片段:

    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进行缩放、优化或扭曲

相关问题:

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

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


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

不幸的是,迁移到/assets也没有做任何事情。位图大小正好是1024*1024。可以单独平铺每个块,但它会像当前的假平铺调整那样高效吗?好吧,那么这可能是由于计算中累积的错误造成的-您应该将准备好的计算值传递到着色器中,然后查看结果。您是否也尝试过在顶点着色器中使用
highp
浮动?或者(最坏的情况)这确实是视频驱动程序的错误。我担心不可能预先计算纹理坐标,以便在着色器外部进行假重复。是的,现在使用顶点着色器中的highp,但没有影响。此外,我还发现了一些问题,但我无法整理出建议的解决方案。如果使用
sampler2D
glu REPEAT
纹理对纹理进行采样时使用了较大的值,那么您应该以某种方式钳制这些值。我也遇到过类似的问题,原因是Tegra2 GPU上的采样器精度不高。这似乎是同一个问题,不同之处在于我的atlas part repeating自定义着色器,而不是GL_REPEAT参数,但它在大浮点值上面临同样的精度问题。我尝试减少“未使用的”整数伪重复值部分,并开始使用负值使顶点纹理坐标值初始化的浮动更接近0,现在大型几何体看起来好多了@keaukraine,谢谢你的建议和建议。