OpenGL规范从2.0开始支持显示边长为非2次幂的Texture,但限制条件是需要环绕模式为CLAMP_TO_EDGE并且过滤模式为NEAREST或者LINEAR。

解除限制的条件是硬件支持OES_texture_npot的扩展。

获取硬件扩展列表的代码如下:

    std::string GetGLString(unsigned int pname) {
const char* gl_string =
reinterpret_cast<const char*>(glGetString(pname));
if (gl_string)
return std::string(gl_string);
return "";
}
...
const char* gl_extensions = GetGLString(GL_EXTENSIONS).c_str();
ULOGE("gl_extensions %s", gl_extensions);
//看打印的字符串里是否包含OES_texture_npot

OpenGL 2.0规范里有这个限制,是因为NPOT纹理设置REPEAT等模式时,在应用插值采样后,会造成图案连接处有接缝:

Seamless tilemap rendering (borderless adjacent images)

OpenGL对NPOT纹理的支持情况:

OpenGL ES 3.0 has full NPOT support in core; ES 2.0 has limited NPOT support (no mipmaps, no Repeat wrap mode) in core; and ES 1.1 has no NPOT support.

For ES 1.1 and 2.0, full NPOT support comes with GL_ARB_texture_non_power_of_two orGL_OES_texture_npot extension. In practice, iOS devices don’t support this; and on Android side there’s support on Qualcomm Adreno and ARM Mali. Possibly some others.

For ES 1.1, limited NPOT support comes with GL_APPLE_texture_2D_limited_npot (all iOS devices) or GL_IMG_texture_npot (some ImgTec Android devices I guess).

而谷歌从Android7.0开始强制要求设备支持OpenGL3.1, 之前的设备还是可以只支持OpenGL2.0:android-7.0-cdd.pdf

所以可以认为,Android 7.0以上的设备以及iOS 7.0(iPhone系列 5S)以上的设备,启用OpenGL3.0后,支持对NPOT纹理应用GL_REPEAT等功能。而Android的7.0以前的设备,如果硬件支持OES_texture_npot扩展,那么也同样支持。

iOS升级3.0的文档:Adopting OpenGL ES 3.0

参考:

NPOT texture in iOS can't be repeat mode!

PowerVR Supported Extensions OpenGL ES and EGL

update:

实践的结论是,用shader在OpenGL2.0上实现NPOT的GL_REPEAT模式,预览效果也还好。在几台Android和iOS设备上测试,连接处的缝隙看不出来。

所以OpenGL2.0不支持的原因,我猜是在mipmap的场景下可能有问题。

实现的代码有比较简单:

// GL_REPEAT
gl_FragColor = texture2D(uTexture, fract(vTexCoord));
// GL_MIRRORED_REPEAT
vec2 clipCoord = mod(vTexCoord, 2.0);
gl_FragColor = texture2D(uTexture, mix(clipCoord, 2.0 - clipCoord, step(1.0, clipCoord)));
 

NPOT纹理与平铺模式OpenGL规范的更多相关文章

  1. TileMode(平铺模式) 枚举的成员:

    TileMode(平铺模式) 枚举的成员:   成员名称 说明   FlipX 与 Tile 相同,只不过图块的交替列被水平翻转. 基本图块本身不翻转.   FlipXY FlipX 和 FlipY ...

  2. iOS UIButton 设置图片平铺

    UIImage *image2 = [UIImage imageNamed:imgName]; CGFloat top = ; // 顶端盖高度 CGFloat bottom = ; // 底端盖高度 ...

  3. zTree变异篇:如何让同级树节点平铺而非垂直显示

    昨天有一个zTree的使用者在实际的项目中有着这样一个特殊的需求,要求同级树节点能够水平显示,根据设定的宽度自动换行,效果图如下所示:   通过在浏览器调试模式下观察其同级节点的css为: 这个dis ...

  4. Mac下的平铺式桌面 - Yabai

    Mac下的平铺式桌面 - Yabai 近来无事,凑着周末休息的时间,想折腾一下 Mac.很久之前就有朋友给我推荐过一款名为"Yabai"的平铺式桌面管理软件,今天,就折腾起来了. ...

  5. Dvtm -- 平铺式终端

    Dvtm -- 平铺式终端_Linux伊甸园开源社区-24小时滚动更新开源资讯,全年无休! Dvtm -- 平铺式终端 关注我们: 如果你使用过 Dwn 或 Awesome 这种平铺式窗口管理器,一定 ...

  6. 平铺式窗口管理器 Musca 初体验

    作者: 吴吉庆 Version: 1.0 release: 2009-11-04 update: 2009-11-04 为什么用平铺式窗口管理器? 什么是平铺式窗口管理器(tiling window ...

  7. php 给图片增加背景平铺水印代码

    如果你想利用php 给图片增加背景平铺水印效果话,必须利用php的一个插件来实例,就是利用imagick,他可以给图片增加背景平铺水印效果哦,下面我们提供一款实例代码. 如果你想利用php教程 给图片 ...

  8. 用 SDL2 加载PNG平铺背景并显示前景

    上一篇中加载的是BMP,这次可以引用 SDL2_image.lib,加载更多格式的图像. LoadImage函数做了改动,区别在于不用将surface转换成texture了. 环境:SDL2 + VC ...

  9. 用 SDL2 平铺背景并显示前景

    环境:SDL2 + VC++2015 下面的代码将打开background.bmp和image.bmp,将background平铺背景,将image作为前景呈现 #include <iostre ...

随机推荐

  1. flutter——android报错建议Suggestion: add 'tools:replace="android:label"'

    问题: 安装了一个新包,android出现了报错,建议add 'tools:replace="android:label"'. 原因: 项目application的label属性冲 ...

  2. Laravel使用Ajax提交表单报419 unknown status错误的解决方法

    1.在head标签中间添加一行meta标签:<meta name="csrf-token" content="{{ csrf_token() }}"> ...

  3. vue-cli2.0创建项目步骤

    Vue是近两年来比较火的一个前端框架(渐进式框架吧),与reactjs和angularjs三国鼎立,我不是职业前端,做过Vue,了解了一下React,听说过Angluar.我只能这么说,我来晚了,没经 ...

  4. 扩展中国剩余定理(EXCRT)快速入门

    问题 传送门 看到这个问题感觉很难??? 不用怕,往下看就好啦 假如你不会CRT也没关系 EXCRT大致思路 先考虑将方程组两两联立解开,如先解第一个与第二个,再用第一个与第二个的通解来解第三个... ...

  5. STM32入门系列-学习STM32要掌握的内容

    STM32芯片架构 STM32F103系列芯片的系统架构如下: STM32芯片基于ARM公司的Cortex-M3内核,由ST公司设计生产,内核与总线矩阵之间有I(指令).S(系统).D(数据)三条信号 ...

  6. 盘点.NET JIT在Release下由循环体优化所产生的不确定性Bug

    盘点在Release下由循环体优化所产生的不确定性Bug 在这篇文章中,我将介绍一些在测试环境(DEBUG)下正常,但在生产环境(Release)下却会出现的一些让人难以捉摸的Bug. 如果你对开源技 ...

  7. 应用LORAWAN技术的好处是什么

    LoRaWAN现在一种非常流行的LPWA通信标准,在ISM(工业.科学.医疗)频段使用未经许可的无线电频谱,频率约为900MHz到430MHz(世界各地的标准各不相同). 物联网连接环境除了智能家庭联 ...

  8. 云计算管理平台之OpenStack块存储服务cinder

    一.cinder简介 cinder是openstack环境中的块存储服务,主要为运行在openstack之上的虚拟机提供块存储服务的:所谓块存储就是我们经常用的硬盘呀,U盘啊,SD卡等等这些块设备的, ...

  9. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

  10. 被巴菲特看中的Snowflake,是怎样深刻改变云计算产业的?

    众所周知,在很长一段时间里,巴菲特都从来不碰科技股.但人总是会变的,他在2016年开始首次持仓苹果,并在此后一再增持,目前苹果为伯克希尔第一大重仓股. 前不久,巴菲特持股了人生中的又一家科技公司--S ...