有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OpenGL ES纹理图谱失真

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

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

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

Screenshots

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

  • 使用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);
    }

共 (1) 个答案

  1. # 1 楼答案

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

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

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

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

    最终,您不应该在着色器中进行这种计算——而是在Java代码中进行这种计算,并将采样器的最终坐标传递到着色器中