用旋转绘制时的神器

时间:2016-03-27 18:18:31

标签: c# opengl opentk

我注意到当我在旋转的矩形中绘制纹理时会出现一个奇怪的神器。

我的基本照片是:

enter image description here

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

enter image description here

但是当我开始在一个旋转的方格中绘制它们时,在圆圈的底部和右侧有2个文物。

enter image description here

我无法找出他们来自哪里......

有什么想法吗?

编辑:抱歉,忘记添加我的绘图代码:

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);

1 个答案:

答案 0 :(得分:4)

如Remy Grandin的评论所述,这件神器可能会被删除"通过将纹理包装模式设置为ClampToEdge。尽管解决了眼前的问题,但我不同意这是一个答案。

如果仔细观察图像,圆圈顶部和左侧也会有文物。这是因为纹理外部的opengl采样。环绕模式决定在纹理外部采样时会发生什么。据我所知,这并不是你想要的,虽然这种效果目前似乎是可取的。

想象一下采样纹理坐标1.1。默认是"重复",这是一个简单的fmod(x,1.0)。在我们给出0.1的例子中。矩形右侧的工件实际上是矩形左侧的一部分。 " ClampToEdge"将坐标从1.1设置为1.0。这并不能解决左侧的瑕疵,因为左侧的矩形没有覆盖像素的问题,而右侧覆盖太多。世界上没有包装模式可以解决这个问题。

解决方案是将您的圆圈置于纹理数据中心并具有白色/不可见边框(不确定您拥有的是什么),使得包裹模式最终无关紧要,直到您希望实际定义超出0.0-1.0范围的纹理坐标为止。因为这就是包装模式所做的。

你没有在问题中包含左边和上边的文物,但我冒昧地为你注意了它们。