2016-03-27 5 views
3

Я заметил странный артефакт, возникающий при рисовании текстуры в повернутом прямоугольнике.Артефакт при рисовании с поворотом

Моя основная картина такова:

enter image description here

Когда я рисую "по горизонтали", то результат, как и ожидалось:

enter image description here

Но когда я начинаю рисовать их в повернутый квадрат, два артефакта появляются внизу и справа от круга.

enter image description here

Я не могу шва, чтобы выяснить, откуда они пришли ...

Любые идеи?

EDIT: Извините, забыл добавить свой код рисования:

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

Действительно, это было то, что я определил 2 TexParameter (TextureWrapS и TextureWrap) для ClampToEdge, и он исчез! Если бы вы не поставили свой ответ на должность, я бы с радостью принял его в качестве принятого. –

ответ

4

Как уже упоминалось в комментариях Реми Грандин артефакт может быть «удален», установив режим текстуры для обертывания в ClampToEdge. Я бы не согласился с тем, что это был ответ, хотя, хотя и решал непосредственную проблему.

Если вы посмотрите внимательно на изображения, есть также артефакты сверху и слева от кругов. Это из-за выборки opengl вне текстуры. Режим обрезки решает, что происходит при выборке вне текстуры. Насколько я понимаю, это не совсем то, что вы хотите, хотя эффект может показаться желательным на данный момент.

Представьте себе, что образец текстуры координат 1.1. Значение по умолчанию - «repeat», что является простым fmod (x, 1.0). В нашем примере дается 0.1. Артефакт справа от прямоугольника - это часть левой части прямоугольника. «ClampToEdge» ставит координату от 1,1 до 1,0. Это НЕ решает ваши артефакты с левой стороны, так как левая сторона имеет проблемы с прямоугольником, который не покрывает пиксели полностью, в отличие от правой стороны, слишком сильно покрывающей. Никакой режим обертывания в мире не может это исправить.

Решение состоит в том, чтобы центрировать ваш круг в данных текстуры и иметь белую/невидимую границу (не уверен, что у вас там есть), делая режим обертывания в конечном счете несущественным, пока вы не захотите определить координаты текстуры за пределами 0.0-1.0 ассортимент. Потому что это режим обмотки.

Вы не указали левый и верхний артефакты в вопросе, но я взял на себя смелость, отметив их для вас.

Смежные вопросы