【问题标题】:OpenGL ES texture atlas distortionOpenGL ES 纹理图集失真
【发布时间】:2014-02-25 20:01:51
【问题描述】:

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

大部分(Samsung Galaxy Ace、Samsung Galaxy Gio 等) 都还好,只是出现出血(希望我可以通过半像素校正来修复它)。

但是 三星 Galaxy S3 距离第二:

Screenshots

(似乎也出现了从较弱到更严重的失真区域的跳跃,它恰好发生在常规的图集宽度或高度传递上)

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 不幸的是,迁移到 /assets 也无济于事。位图大小正好是 1024*1024。可以单独平铺每个块,但它会像当前的假平铺调整那样有效吗?
    • 好的,那么它可能是由计算中的累积错误引起的 - 您应该将准备好的计算值传递给着色器并查看结果。您是否也尝试过在顶点着色器中使用 highp 浮动?或者(最坏的情况)它确实是视频驱动程序的错误。
    • 恐怕不可能在着色器外为假重复预先计算纹理坐标。是的,现在使用顶点着色器中的 highp,但没有任何影响。另外,我发现了thisthis 的问题,但我无法整理出建议的解决方案
    • 如果您使用较大的值对带有sampler2DGL_REPEAT 纹理的纹理进行采样,那么您应该以某种方式钳制这些值。我遇到过由于 Tegra2 GPU 上的采样器精度不足而导致的类似问题。
    • 似乎是同一个问题,不同之处在于我的图集部分重复而不是 GL_REPEAT 参数的自定义着色器,但它在大浮点值上面临相同的精度问题。我尝试减少“未使用的”整数假重复值部分,并开始使用负值使浮点数更接近 0 用于顶点的纹理坐标值初始化,现在大几何看起来好多了。 @keaukraine,感谢您提出的建议和好建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2012-07-07
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多