C#에서 OpenTK를 통해 OpenGL을 사용하고 있으며 일반 비트 맵에서 텍스처를로드하려고합니다. 내 드라이버는 NPOT 텍스처를 지원하지 않으므로 GLTexImage2D와 함께 POT 텍스처를 할당하고 GL.TexSubImage2D를 통해 내 비트 맵을 채 웁니다. 그러나 그 텍스트를 그리는 동안 유물이 있습니다. 텍스처의 아래쪽과 오른쪽에 추가 픽셀을 그립니다. 비율에서 픽셀을 뺍니까 아니면 잘못된 것이 있습니까? 창작NPOT 텍스처에 OpenGL GL.TexSubImage2D를 사용하면 아티팩트가 발생합니다.
번호 : 드로잉
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 정말 좋은 설명. 그러나 문제는 축소 된 텍스처 그리기를위한 밉맵입니다. 어떤 해결책이 있습니까? – Flamefire
@Flamefire 텍스처의 내용에 달려 있다고 생각합니다. 알파 또는 배경색으로 먼저 지울 수 있습니다 (FBO + glClear로 빠름). 그렇지 않다면, RetoKoradi가 말했듯이 국경을 더하는 것이 더 나을 수도 있습니다. 처음 몇 개의 밉맵 레벨 만 사용하면 테두리가 작아 질 수 있습니다. 또한 속도를 높이기 위해 조각 쉐이더에서 생성 할 수도 있습니다. – jozxyqk
이것을 달성하기 위해 FBO를 사용하는 방법에 대한 링크를 제공해 주시겠습니까? – Flamefire