如何解决OpenGL / OpenTK将纹理映射到2D圆形或不规则多边形
我正在尝试获取opengl纹理以映射到不规则形状的2d多边形(基本上是门口的半拱形)。(请参见下图)
我发现将纹理映射到矩形多边形,三角形等非常容易,可以很好地形成风景,山脉,墙壁,但是还没有找到解决不规则多边形的方法。我想尝试构建一些多边形模板,我可以实时填充各种纹理,以生成外观相同且结构相同的结构。我可以使用预渲染的图像,但认为这样做会更灵活。
下面是我用来尝试填充拱门的代码,从图片中可以看到,尽管传递了相同的点以绘制多边形,但仍希望将其填充为更多的4点平面。 (注意:某些类型封装了opengl函数,也将粘贴相关的封装):
library(dplyr)
library(lubridate)
library(purrr)
dat %>%
group_by(date = date(timestamp),process_name) %>%
filter(any(map2_lgl(start_time,end_time,~any(between(timestamp,.x,.y)))))
以上内容在图片中渲染了带圆圈的拱形区域。最后一行用浅蓝色勾勒出圆弧点,以显示我要填充的区域,并验证我确实具有正确的相对形状。
大多数代码只是将拱门的点映射到屏幕上,然后计算纹理上的相对源点。 Texturepolygon的代码如下:
Size tileSize = new Size(64,32);
int wallHeight = 96;
int wallDepth = 6;
GL2ImageSource wallSrc = GL2MemoryManager.GetimageSource(70000); //This is just glTexture refernece
int drawX = 585;
int drawY = 590;
Point[] points = new Point[]
{
new Point(drawX,drawY),new Point(drawX - tileSize.Width/8,drawY - tileSize.Height/8),new Point(drawX - tileSize.Width/8,drawY - (wallHeight + tileSize.Height/8))
//new Point(drawX,};
List<Point> candidatePoints = new List<Point>();
candidatePoints.Add(new Point(drawX + tileSize.Width / 3,drawY + tileSize.Height / 3 - wallHeight));
candidatePoints.Add(new Point((int)(drawX - tileSize.Width / 28),(int)((drawY + tileSize.Height / 6) - wallHeight / 1.5)));
candidatePoints.Add(new Point(drawX,drawY));
List<Point> archPoints = new List<Point>(points);
archPoints.AddRange(GL2Calculation.ComputeCurve(candidatePoints.ToArray()));
List<Point> sourcePoints = new List<Point>();
Rectangle Box = archPoints.BoundingBox();
foreach (Point p in archPoints)
{
int sl = (int)((p.X - Box.Left) / (float)Box.Width * ((wallSrc.Width / 2) - 1));
int st = (int)((p.Y - Box.Top) / (float)Box.Height * (wallSrc.Height - 1));
sourcePoints.Add(new Point(sl,st));
}
Graphics.Texturepolygon(wallSrc,sourcePoints.ToArray(),archPoints.ToArray(),Color.White);
Graphics.Drawpolygon(archPoints.ToArray(),Color.LightBlue,2.0f);
任何帮助或建议将不胜感激。
提前谢谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。