旋转绘图时的工件
Artifact when drawing with a rotation
我注意到在旋转矩形中绘制纹理时出现奇怪的伪像。
我的基本图片是这样的:
当我绘制 "horizontally" 时,结果符合预期:
但是当我开始在旋转的正方形中绘制它们时,2 个伪像出现在圆的底部和右侧。
我不知道它们是从哪里来的...
有什么想法吗?
编辑:抱歉,忘记添加我的绘图代码:
GL.Enable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, graphics.TextureId);
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
GL.Begin(PrimitiveType.Quads);
Point tlCorner = displayObject.LocalToGlobal(0,0);
Point trCorner = displayObject.LocalToGlobal(displayObject.Width, 0);
Point brCorner = displayObject.LocalToGlobal(displayObject.Width, displayObject.Height);
Point blCorner = displayObject.LocalToGlobal(0, displayObject.Height);
GL.TexCoord2(0.0f, 0.0f);
GL.Vertex2(tlCorner.X, tlCorner.Y);
GL.TexCoord2(1.0f, 0.0f);
GL.Vertex2(trCorner.X, trCorner.Y);
GL.TexCoord2(1.0f, 1.0f);
GL.Vertex2(brCorner.X, brCorner.Y);
GL.TexCoord2(0.0f, 1.0f);
GL.Vertex2(blCorner.X, blCorner.Y);
GL.End();
GL.Disable(EnableCap.Texture2D);
GL.Disable(EnableCap.Blend);
正如 Remy Grandin 在评论中提到的,通过将纹理环绕模式设置为 ClampToEdge,伪影可能 "removed"。虽然解决了眼前的问题,但我不同意它是一个答案。
如果仔细观察图像,在圆圈的顶部和左侧也有伪影。这是因为纹理外的 opengl 采样。环绕模式决定在纹理外采样时发生的情况。据我了解,这并不是您想要的,尽管目前看起来效果不错。
想象采样纹理坐标1.1。默认为 "repeat",这是一个简单的 fmod(x, 1.0)。在我们的例子中给出 0.1。矩形右侧的工件实际上是矩形左侧的一部分。 "ClampToEdge" 将坐标从 1.1 放到 1.0。这并不能解决左侧的伪像,因为左侧存在矩形未完全覆盖像素的问题,而右侧覆盖太多。世界上没有任何包装模式可以解决这个问题。
解决方案是将你的圆圈置于纹理数据的中心并有一个 white/invisible 边框(不确定你那里有什么),使环绕模式最终变得无关紧要,直到你真正想要定义纹理坐标超出0.0-1.0 范围。因为这就是包装模式的作用。
您没有在问题中包括左边和顶部的工件,但我冒昧地为您指出了它们。
我注意到在旋转矩形中绘制纹理时出现奇怪的伪像。
我的基本图片是这样的:
当我绘制 "horizontally" 时,结果符合预期:
但是当我开始在旋转的正方形中绘制它们时,2 个伪像出现在圆的底部和右侧。
我不知道它们是从哪里来的...
有什么想法吗?
编辑:抱歉,忘记添加我的绘图代码:
GL.Enable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, graphics.TextureId);
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
GL.Begin(PrimitiveType.Quads);
Point tlCorner = displayObject.LocalToGlobal(0,0);
Point trCorner = displayObject.LocalToGlobal(displayObject.Width, 0);
Point brCorner = displayObject.LocalToGlobal(displayObject.Width, displayObject.Height);
Point blCorner = displayObject.LocalToGlobal(0, displayObject.Height);
GL.TexCoord2(0.0f, 0.0f);
GL.Vertex2(tlCorner.X, tlCorner.Y);
GL.TexCoord2(1.0f, 0.0f);
GL.Vertex2(trCorner.X, trCorner.Y);
GL.TexCoord2(1.0f, 1.0f);
GL.Vertex2(brCorner.X, brCorner.Y);
GL.TexCoord2(0.0f, 1.0f);
GL.Vertex2(blCorner.X, blCorner.Y);
GL.End();
GL.Disable(EnableCap.Texture2D);
GL.Disable(EnableCap.Blend);
正如 Remy Grandin 在评论中提到的,通过将纹理环绕模式设置为 ClampToEdge,伪影可能 "removed"。虽然解决了眼前的问题,但我不同意它是一个答案。
如果仔细观察图像,在圆圈的顶部和左侧也有伪影。这是因为纹理外的 opengl 采样。环绕模式决定在纹理外采样时发生的情况。据我了解,这并不是您想要的,尽管目前看起来效果不错。
想象采样纹理坐标1.1。默认为 "repeat",这是一个简单的 fmod(x, 1.0)。在我们的例子中给出 0.1。矩形右侧的工件实际上是矩形左侧的一部分。 "ClampToEdge" 将坐标从 1.1 放到 1.0。这并不能解决左侧的伪像,因为左侧存在矩形未完全覆盖像素的问题,而右侧覆盖太多。世界上没有任何包装模式可以解决这个问题。
解决方案是将你的圆圈置于纹理数据的中心并有一个 white/invisible 边框(不确定你那里有什么),使环绕模式最终变得无关紧要,直到你真正想要定义纹理坐标超出0.0-1.0 范围。因为这就是包装模式的作用。
您没有在问题中包括左边和顶部的工件,但我冒昧地为您指出了它们。