Я использую OpenGL через OpenTK на C# и пытаюсь загрузить текстуры из общих растровых изображений. Мой драйвер не поддерживает текстуры NPOT, поэтому я выделяю POT текстуру с GL.TexImage2D и заполняю ее своим растровым изображением через GL.TexSubImage2D. Однако у меня есть артефакты во время рисования этих текстов. Кажется, что он также рисует дополнительный пиксель в нижней и правой частях текстуры. Должен ли я просто вычесть пиксель из соотношения или что-то еще не так?Использование OpenGL GL.TexSubImage2D для текстур NPOT приводит к артефактам
Код для создания:
GL.BindTexture(TextureTarget.Texture2D, t.Name);
GL.PixelStore(PixelStoreParameter.PackAlignment, 1);
GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, texture.W2, texture.H2, 0, PixelFormat.Bgra, PixelType.UnsignedByte, IntPtr.Zero);
GL.TexSubImage2D(TextureTarget.Texture2D, 0, 0, 0, texture.DataSize.Width, texture.DataSize.Height, PixelFormat.Bgra, PixelType.UnsignedByte, data);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.LinearMipmapLinear);
GL.Ext.GenerateMipmap(GenerateMipmapTarget.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, 0);
Код для рисования:
GL.BindTexture(TextureTarget.Texture2D, t.Name);
float x1 = 0;
float x2 = texture.WidthRatio;
float y1 = 0;
float y2 = texture.HeightRatio;
float rx1 = rect.X;
float rx2 = rect.X + rect.W;
float ry1 = rect.Y;
float ry2 = rect.Y + rect.H;
GL.Begin(BeginMode.Quads);
GL.TexCoord2(x1, y1);
GL.Vertex3(rx1, ry1, rect.Z + CGraphics.ZOffset);
GL.TexCoord2(x1, y2);
GL.Vertex3(rx1, ry2, rect.Z + CGraphics.ZOffset);
GL.TexCoord2(x2, y2);
GL.Vertex3(rx2, ry2, rect.Z + CGraphics.ZOffset);
GL.TexCoord2(x2, y1);
GL.Vertex3(rx2, ry1, rect.Z + CGraphics.ZOffset);
GL.End();
GL.Disable(EnableCap.Blend);
GL.BindTexture(TextureTarget.Texture2D, 0);
Где texture.WidhtRatio = DataSize.Width/W2;
+1 Действительно приятно объяснение. Однако проблема связана с картами mip для уменьшенного текстурного рисунка. Какие-нибудь решения здесь? – Flamefire
@Flamefire Я думаю, это зависит от содержания текстуры. Сначала можно очистить его альфой или цвет фона (быстро с FBO + glClear). Если нет, то, как предлагает RetoKoradi, добавление границы может быть лучше. Если вы используете только первые несколько уровней mipmap, граница может быть небольшой. Вы также можете генерировать его в шейдере фрагментов, чтобы ускорить работу. – jozxyqk
Не могли бы вы предоставить ссылку, как использовать FBO для достижения этой цели? – Flamefire