首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何绘制动态2D网格,根据摄像机缩放: OpenGL进行调整

如何绘制动态2D网格,根据摄像机缩放: OpenGL进行调整
EN

Stack Overflow用户
提问于 2020-06-18 03:48:30
回答 1查看 1.7K关注 0票数 2

所以我的问题和标题完全一样。我不是在寻找一个具体的代码示例,只是一些关于任何首选方法的想法/指南。

在我的2D游戏引擎中,我希望有一个网格表示一定数量的像素(例如32x32像素)。我特别希望能够定义,每个网格在世界空间的宽度和高度,在所有线上有一个一致的笔画宽度,并能够根据相机缩放调整瓷砖的大小。

我曾经尝试过几种不同的方法来绘制这个网格:

  1. 我尝试的第一件事是使用自定义着色器绘制网格。我在网上找到了一些代码,这些代码使用了一些我不理解的概念来绘制2D平面上的网格。这种方法的问题在于,我不知道如何控制我的游戏世界中的精确大小,也不知道它一般是如何工作的。
  2. 我的第二种方法是使用我的调试绘图工具。我编写了一套函数,允许我在世界空间中添加不同笔画宽度的线条,我实现了这一点,只需为每一行帧动态生成四条线。

  1. ,我的第三种方法是画一串四边形,然后用一个定制的着色器给出一个轮廓。然后,我只画了一串黑色轮廓的白色四角体,给出了网格的外观。

有人有更好的解决办法吗?在我所有的方法中,我从来没有尝试过根据相机的缩放水平动态调整网格。因此,对于这些方法是否是典型的解决方案,或者是否有更好的解决方案,我们将不胜感激。另外,如果你对如何将这些方法扩展到3D空间有任何想法的话,这也会很好,我似乎找不到一个很好的方法,在世界空间绘制的线条上得到一个一致的笔画宽度。

我的引擎目前也在使用Opengl和C++进行编码,所以我主要关注如何使用现代的opengl,而不是直接模式来实现这个功能。

下面是我想要达到的目标:

编辑:我主要关注渲染技术。你用过几个四角码吗?一个平面和一个复杂的着色器?还是每一行用一个四角码?或者完全是别的什么?

这是我的尝试之一,作为我试图达到的外观和感觉的另一个参考。我只是情不自禁地认为必须有一个比我尝试过的方法更好的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-18 07:03:01

不管呈现方法如何,首先必须计算网格。我这样做:

世界坐标下屏幕的

  1. get AABB (x0,y0,x1,y1)

最好的方法是拥有3x3矩阵,并将从世界坐标转换为GL屏幕空间的所有转换积累起来:

vec2世界,屏幕;mat3 w2s;screen = w2s* world;

为了获得AABB,我们需要相反的屏幕角转换成世界:

mat3 s2w;s2w =反向(W2s);world =S2W*屏幕;

因此,只需将所有4种组合的selecting...

  • grid转换成世界,记住min和max x,y (AABB)让它们称为(x0,y0,x1,y1),这个矩阵对于鼠标交互也是额外有用的,因为它将把鼠标(如果转换为屏幕坐标)转换为世界坐标,您可以使用它来编辑,(+/-1,+/-1) size gx

从AABB计算网格大小。简单地说,如果你的网格是某个世界单位大小的基础(比如10),那么简单地说,网格正方形将会有多大。为了简单起见,我只做单轴(要么使用两个轴的最小值,要么分别使用两个轴):

//假设x0=-50,x1=+180 gx = log10(x1-x0);//最大功率为10,在gx =2.361727836017597886771122512 gx =地板(gx-1);//使用10倍小的网格gx = pow(10,gx);//您在世界坐标x1=+180 start 中的网格大小。

只需将x0,y0gx,gy...重新对齐,只需一个轴:

x0 =地板(X0/gx)-1 x0*= x0*=

简单地从x0循环到x1通过步骤gx和渲染行..。通常,当我通过gx/10并在gx步长线之前渲染一个点或不太亮/粗的线时,我也会进行另一次传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62442050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档