我有一个图像,我想在我的OpenTK(OpenGL的.NET包装器)应用程序中用作纹理。我不知道图像角落的世界坐标,但只知道图像中的一些像素。
这是我的代码(_overlay
是我映射的图像,mapping
是像素世界对应的列表):
BitmapData data = _overlay.LockBits(new Rectangle(0, 0, _overlay.Width, _overlay.Height),
ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
GL.BindTexture(TextureTarget.Texture2D, _textureID);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
_overlay.UnlockBits(data);
GL.Enable(EnableCap.Texture2D);
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha);
GL.Begin(BeginMode.Polygon);
foreach (var m in mapping)
{
var p = new Point(m.PixelInTopLeftCoordinates.X / Image.Width, m.PixelInTopLeftCoordinates.Y / Image.Height);
GL.TexCoord2(p.X, p.Y);
GL.Vertex2(m.WorldCoordinates.X, m.WorldCoordinates.Y);
}
GL.End();
GL.Disable(EnableCap.Texture2D);
GL.Disable(EnableCap.Blend);
映射有效,图像显示在正确的位置。问题是只有所提供像素的凸包被映射。我想提供内部像素,但是纹理映射要插入此映射并显示整个图像。这可能吗?我在网上搜索但是这不是可能的,或者我没有找到合适的关键字,但我找不到任何东西......
答案 0 :(得分:0)
这不是问题本身的答案,而是对同一根本问题的不同解决方案。 我最终做的是找到仿射变换然后求解找到图像角落的相应坐标,然后使用4个角进行纹理映射。
答案 1 :(得分:0)
那你为什么不插入并在图像角上的正确世界位置添加点呢?