首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL ES纹理图谱失真

OpenGL ES纹理图谱失真
EN

Stack Overflow用户
提问于 2014-02-25 20:01:51
回答 1查看 790关注 0票数 2

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

其中大多数(三星Galaxy,三星Galaxy等)都很好,只是出血发生了(希望我能用半像素校正来修复它)。

但三星Galaxy S3在距离上排在第二位:

截图

(从弱到更坏的变形区也似乎也是如此,它恰好发生在规则的地图集宽度或高度传递上)

  • OpenGL ES 2.0,Android被使用。
  • 地图集和瓷砖纹理部分都是锅(地图集1024份,纹理部分64份)。
  • 纹理过滤不重要:试过最近和线性
  • 使用可绘制-nodpi资源文件夹。
  • mat4,vec2,vec4,sampler2D精度变化没有任何作用

我做错了什么?有可能修好吗?

着色器:

顶点:

代码语言:javascript
运行
复制
    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;
    }

片段:

代码语言:javascript
运行
复制
    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);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-26 09:16:26

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

相关问题:Android应用程序加载图像/可绘图-nodpi/具有缩放功能

但是,您应该检查位图的大小。如果它装载了适当的大小,那么问题就不在缩放位图中了。

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

最终,您根本不应该在着色器中进行这样的计算--用Java代码来计算,只需将取样器的最终坐标传递到着色器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22024899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档