微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenGL / OpenTK将纹理映射到2D圆形或不规则多边形

如何解决OpenGL / OpenTK将纹理映射到2D圆形或不规则多边形

我正在尝试获取opengl纹理以映射到不规则形状的2d多边形(基本上是门口的半拱形)。(请参见下图)

Link to Image

我发现将纹理映射到矩形多边形,三角形等非常容易,可以很好地形成风景,山脉,墙壁,但是还没有找到解决不规则多边形的方法。我想尝试构建一些多边形模板,我可以实时填充各种纹理,以生成外观相同且结构相同的结构。我可以使用预渲染的图像,但认为这样做会更灵活。

下面是我用来尝试填充拱门的代码,从图片中可以看到,尽管传递了相同的点以绘制多边形,但仍希望将其填充为更多的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 举报,一经查实,本站将立刻删除。