亚像素移动需要边缘有1个透明像素才能平滑移动

Sub pixel movement need 1 transparent pixel on the edge to move smooth

当我将精灵移动得慢到一个像素时,除了边缘之外,所有东西都移动子像素这是一个视频:https://www.youtube.com/watch?v=zcai1PUfzzA&feature=youtu.be I think it does this because it isn't allowed to scale the image. If I add one transparent pixel to the edge of the image it does look like this : https://www.youtube.com/watch?v=ovCBpBFj3FU&feature=youtu.be可能是因为现在它不需要缩放图像,但是这样"sucks"因为然后我必须做 - 1 在定位上移除透明像素,这样它看起来不错 + 它是一个性能消耗,因为我无法制作图像 "power of 2"。我将如何让它扩展? (如果这是问题所在?)我正在使用 MonoGame 制作我的游戏。

纹理边框颜色正是为这种情况而创建的。

基本思想是你可以用一种不变的颜色。边框颜色也适用于纹理过滤,这可能会隐式获取规范化范围之外的相邻纹素。

特别注意下图:

纹理坐标1.0与其右侧相邻纹素的中心与左侧纹素的中心同样接近,但显然右侧没有邻居,因为1.0是最右边的极值。

在这种情况下,GL 的默认行为是 repeat(从图像左侧获取那个不存在的纹素),但您可以使用称为 clamp to border 的特殊钳位模式来让它代替你的纹理边框颜色。

您可以像这样在 GL 中设置纹理的边框颜色:

GLfloat border [4] = { 1.0f, 1.0f, 1.0f, 0.0f };
glTexParameterfv (GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border);

但是,您还没有完成 - 纹理过滤是实现所描述的工作所必需的。

如果同时使用透明边框颜色和线性纹理过滤,则可以平滑由于加权平均引起的子像素移动。当多边形移动时,像素中心的纹理坐标会略有不同,这会影响赋予透明边界和不透明边缘纹素的权重。因此,不透明度的变化将平滑地插入可见锯齿。

将所有这些放在一起会产生与您在 YouTube 上显示的相同的结果,而无需修改实际图像。