You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL如何用纹理图集的瓦片绘制任意尺寸按钮?

解决9宫格瓦片按钮非标准尺寸的伪影问题

你的9宫格按钮方案本身没问题,问题出在非倍数尺寸时的瓦片处理逻辑,不是方法错误,是细节没处理到位。

具体解决方法

  • 固定边角,重复填充边框与中心
    四个边角直接用原32px瓦片,保持尺寸不变;上下边框取横向1px宽的可重复条带、左右边框取纵向1px高的可重复条带,平铺填满所需的非标准宽度/高度;中心区域取1px×1px的可重复区域平铺,完全避免拉伸整块瓦片。
  • 纹理图集适配设置
    导出纹理图集时给每个瓦片加1px空白边距,防止纹理采样边缘泄露;渲染时将可重复区域的纹理包裹模式设为重复(比如OpenGL的GL_REPEAT、Unity的Wrap Mode设为Repeat),让小条带自动重复填满目标区域。
  • 精确计算纹理坐标
    用浮点坐标计算采样范围,避免像素值截断导致的偏移。比如要填充36px宽的上边框,直接取边框瓦片中间1px条带的纹理坐标,重复平铺36次,而非拉伸32px的瓦片到36px。

伪代码示例

// 按钮尺寸:width=100, height=100
// 瓦片尺寸:tileSize=32

// 绘制四个边角
drawTile(topLeft, 0, 0, tileSize, tileSize)
drawTile(topRight, width-tileSize, 0, tileSize, tileSize)
drawTile(bottomLeft, 0, height-tileSize, tileSize, tileSize)
drawTile(bottomRight, width-tileSize, height-tileSize, tileSize, tileSize)

// 绘制上下边框(横向1px重复带)
drawRepeatingTile(topBorder, tileSize, 0, width-2*tileSize, tileSize, tileX=1, tileY=0, tileWidth=1, tileHeight=tileSize)
drawRepeatingTile(bottomBorder, tileSize, height-tileSize, width-2*tileSize, tileSize, tileX=1, tileY=tileSize-1, tileWidth=1, tileHeight=tileSize)

// 绘制左右边框(纵向1px重复带)
drawRepeatingTile(leftBorder, 0, tileSize, tileSize, height-2*tileSize, tileX=0, tileY=1, tileWidth=tileSize, tileHeight=1)
drawRepeatingTile(rightBorder, width-tileSize, tileSize, tileSize, height-2*tileSize, tileX=tileSize-1, tileY=1, tileWidth=tileSize, tileHeight=1)

// 绘制中心填充(1px×1px重复带)
drawRepeatingTile(center, tileSize, tileSize, width-2*tileSize, height-2*tileSize, tileX=1, tileY=1, tileWidth=1, tileHeight=1)

内容的提问来源于stack exchange,提问作者user1063364

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:15:27