旋转绘图时的工件

Rem*_*din 3 c# opengl opentk

当我在旋转的矩形中绘制纹理时,我注意到出现了一个奇怪的工件。

我的基本图片是这样的:

在此处输入图片说明

当我“水平”绘制时,结果如预期:

在此处输入图片说明

但是当我开始在旋转的正方形中绘制它们时,在圆圈的底部和右侧会出现 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);
Run Code Online (Sandbox Code Playgroud)

And*_*eas 5

正如 Remy Grandin 在评论中提到的,可以通过将纹理环绕模式设置为 ClampToEdge 来“移除”工件。尽管解决了眼前的问题,但我不同意这是一个答案。

如果仔细观察图像,圆圈的顶部和左侧也会出现伪影。这是因为纹理外的opengl采样。环绕模式决定在纹理外采样时会发生什么。据我了解,这并不完全是您想要的,尽管目前效果似乎是可取的。

想象一下采样纹理坐标 1.1。默认为“重复”,这是一个简单的 fmod(x, 1.0)。在我们的示例中给出 0.1。矩形右侧的工件实际上是矩形左侧的一块。“ClampToEdge”将坐标从 1.1 放到 1.0。这并不能解决左侧的伪影,因为左侧的矩形没有完全覆盖像素,而右侧覆盖的像素过多。世界上没有任何包装模式可以解决这个问题。

解决方案是将您的圆圈置于纹理数据的中心并有一个白色/不可见的边框(不确定您在那里有什么),使环绕模式最终变得无关紧要,直到您真正希望定义超出 0.0-1.0 范围的纹理坐标。因为这就是包装模式的作用。

您没有在问题中包含左侧和顶部工件,但我冒昧地为您指出了它们。