Articles of 绘制顺序

DirectX11:绘制多个对象

如何使用DrawIndexed()在屏幕上一次绘制多个不同的对象,并使用多个顶点缓冲区? (绘制相同的对象很简单,我不期待实例) …但我正在寻找转换两个不同的顶点缓冲区。 (是的,我正在使用索引顶点)

自上而下的瓷砖游戏渲染顺序

我正在做一个简单的自上而下的(像这样 )基于瓦的游戏(使用JavaScript,供参考) 我使用Tiled制作地图。 我有超过一个瓷砖高的精灵,所以每当他们在一些物体的前面或后面时,多于一个瓷砖高的瓷砖将被显示在玩家面前。 我正在寻找一种方法来给某些瓷砖“高度”,使得只有那个高度的字符才能出现在这些瓷砖的前面。 下面是一个显示我的问题的截图(精灵是doge,因为它是我发现的第一个图片): 相同的瓷砖并不总是相同的高度,所以我不能给瓷砖设置高度。 我想过一种方法来给瓷砖高度,那就是有一个(隐藏)图层来描述某些瓷砖的高度。 但是,这个解决scheme实施会很慢并且很痛苦。 我想知道是否有更好的方法来做到这一点。 我还有其他一些潜在的想法:每个高度都有一个瓦片层,根据下面的瓦片猜测瓦片在运行时的高度(可能会出问题),但是我认为这样做肯定会有更好的方式。

创建多个渲染系统在实体 – 组件系统中绘制不同的实体

在创建基于ECS的游戏引擎时,你(或者我可以)创建多个渲染系统吗? 比方说,我有一个实体类,这是我的引擎中的基本单位,它所能做的就是添加,删除和获取附加的组件。 我有一个组件类,它只是一个类,其他组件可以派生并保存可用于定义实体的数据。 我有一个绘制方法的RenderSystem接受要绘制的实体。 我的问题是,我必须(或可以)创建RenderSystem的不同派生来满足不同的渲染? 一个例子是渲染精灵时,我必须创建一个单独的SpriteRenderSystem和animation我必须创建AnimationRenderSystem ? 另外我有一个世界级的管理一切,与实体和组件经理和系统。 那个类有一个Update和Draw方法。 所以,我必须检查正在处理的实体是否是特定types的SpriteEntity或AnimationEntity,并使用特定的渲染器? // World class … void Draw() { // Loop through all entities for (…) { // Check for specific entities if (entities[i] is SpriteEntity) { // Call specific sprite renderer _spriteRendererSystem.Draw(entities[i]); } else if (entities[i] is AnimationEntity) { // Call specific animation renderer _animationRendererSystem.Draw(entities[i]); } […]

如何在建筑物的后面和前面画一个角色? (等轴测图)

在等轴测地图中,如何将玩家拖到后面和某个建筑物的前面:我应该把它们切片,用地图上的数字(通常是一个瓦片的数字)来代替地图中的数字(每个数字都是一块一个更大的瓷砖),并以某种方式添加与每个小号(建筑物)相关的Z顺序,像这样? //replace : var map = [ [1,0,1], [0,1,1], [0,0,1], [0,0,1] ]; //by : var map = [ [["2-zOrder/1","3-zOrder/1"],0,1], [1,1,1], [1,0,1], [0,0,1] ];

2D地图编辑器中有多less个边缘/底层?

我在XNA中创建了一个高度灵活的基于二维贴图的地图编辑器,使我未来的一些项目更容易一些(可以用于横向卷轴和自上而下的游戏)。 这个编辑器可以处理任何大小的瓷砖。 这个编辑器是基于一个标准的系统。 它有预先确定的层次,例如Base,Fringe和Collision。 不过,我遇到了一些问题。 我不知道要使用多less个Fringe图层。 我将使用相当详细的地图集,并希望有足够的Fringe图层能够渲染各种相当复杂的场景(例如,有大量树木重叠的森林)。 我也在考虑有多个基础层,使得玩家可以在桥上走过。 所以我的问题是:是否有一个“正确的方法”来处理这种情况,如果是的话,那是什么? 只有很多的边缘和底层? 如果你是一个地图编辑器,你会如何/希望接近这种情况? 另外,虽然我在这里有这个问题,在3D数组中存储分层的地图是一个很好的方法去做事情? 这意味着第一个层次是一个层次数组,第二个层次是图层中的瓦片列数组,第三个是列内的瓦片行数组。

如何让一个精灵始终显示在其他东西后面?

我需要做的就是让一个Sprite始终面对相机,与任何简单的游戏UI对象相同,但是总是显示在其他所有东西之后。 我怎样才能实现在Unity中使用C#? 关于永远在后面的渲染,我试图设置雪碧的“在图层顺序”为0或负值,没有成功。 我也尝试设置所有的游戏对象比精灵的更大的价值: go.GetComponent<Renderer>().sortingLayerName = "Test"; go.GetComponent<Renderer>().sortingOrder = 1; 那也不行。 将精灵总是显示在其他所有东西(其他精灵,GUI和3D网格)后面的正确方法是什么?如果可能,最好不要求助于着色器? PS:关于Sprite总是面对相机的效果,就像在游戏的用户界面中一样,我想这只是一个更新它向相机旋转的问题 – 但是我很乐意看看其他方法是否可行/更适合到任务。

使用3D物理引擎的Top Down 2D游戏的最佳深度sorting方法

我花了好几天的时间来search这个内容,并且仍然遇到了我想问的关于我的游戏引擎的问题,我之前没有看到这个问题。 我认为问题在于我的游戏是使用XNA的SpriteBatch完全2Dgraphics方法,以及完全禁用旋转的3D引擎(惊人的BEPU物理引擎)的不寻常组合。 从本质上来说,我的问题和这个(关于“人造3D”的部分是类似的) ,但不同的是,在我的游戏中,玩家以及其他所有的生物都是由3D物体代表的,他们都可以跳跃,把其他的物体扔掉,然后把它扔掉。 这意味着,按照某一个值sorting,比如Z位置(屏幕上角色南/北有多远)将不起作用,因为一旦一个较小的生物跳到一个更大的生物上,方块,然后向后走,当它的z值小于其他生物时,它会出现在它实际上站在的物体后面。 我实际上最初是通过将游戏中的每个对象分解成物理盒子来解决这个问题的,这些盒子的Y高度必须等于Z的深度。 然后,我根据对象的y位置(距离地面有多高)的深度sorting值加上它的z位置(屏幕上北或南多远)。 这种方法的问题在于,它要求将游戏中的所有移动对象graphics地分割成与具有与其尺寸z维度相等的物理盒子匹配的块。 这是愚蠢的。 所以,我昨天晚上得到了启发,用一种新的方法来重写。 我的新方法稍微复杂一些,但我认为更理智一些:需要按照游戏深度sorting的每个对象都公开接口IDepthDrawable,并将其添加到DepthDrawer对象所拥有的列表中。 IDepthDrawable包含: public interface IDepthDrawable { Rectangle Bounds { get; } //possibly change this to a class if struct copying of the xna Rectangle type becomes an issue DepthDrawShape DepthShape { get; } void Draw(SpriteBatch spriteBatch); } 每个IDepthDrawable对象的边界矩形表示绘制到屏幕时将占用的二维轴alignment边界框。 任何不相交的屏幕将在这个阶段被淘汰,剩下的屏幕上的IDepthDrawables将会被交叉testing。 这是我对自己在做什么不太确定的地方。 每一组冲突都将被添加到列表或其他集合中,并且每个列表将根据其DepthShape属性进行自我sorting,该属性将有权访问要绘制的对象的物理信息。 为了开始,让我们假设游戏中的所有内容都是一个alignment3D Box形状的轴。 盒子很容易分类。 就像是: […]

在我的等距游戏中绘制实体时遇到问题

我正在制作一个等距游戏,在这个游戏中,我将Entities的边界移动到了瓦片上,还有一个3D ArrayList地图由Block在地图中间形成一个塔状结构。 我的问题是,我不知道如何devise一个策略来绘制实体和块,以便它们不会以错误的方式重叠,并以正确的顺序出现。 例如,塔后面的实体将不会被拖到塔上。 目前,我有粗糙的解决办法,把塔作为一个简单的对象,并做一些math来确定天气的实体是在塔的阴影,如果是,不要画它。 你可以在下面的代码中看到我的意思。 但是,这个问题是我的塔顶上有城垛,总是在我的实体的前面。 这看起来不正确。 所以我需要一个适当的,dynamic的方式,我可以在正确的时间以正确的方式绘制所有的实体和块,以便它们以正确的顺序出现 现在,我知道人们用正确方式绘制对象的algorithm,但是我花了大约8个小时在代码中实现了所有这些不同的algorithm。 ( 比如这篇文章中提到的那个 )但是,他们都没有创造我想要的结果。 我不知道这是由于我的代码的性质或其他原因。 我根本不知道。 我的问题的屏幕截图 正如你所看到的,这个实体被拖到前面的地块上, 我的主类(所有发生的地方) import java.awt.*; import java.awt.event.*; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.*; import java.util.stream.IntStream; import javax.imageio.ImageIO; import javax.swing.*; import javax.swing.Timer; public class Main extends JPanel implements ActionListener, KeyListener{ public static final int WIDTH […]

为什么需要一些时间来更新libgdx SortedIteratingSystem中的精灵绘图顺序?

我有一个扩展SortedIteratingSystem的渲染系统,并创建一个比较器来排列精灵绘制顺序。 但问题是当我更新z索引时,它需要一些时间才能更改顺序。 public class RenderingSystem extends SortedIteratingSystem { public RenderingSystem() { super(Family.all(…components).get(), new ZComparator()); } private static class ZComparator implements Comparator<Entity> { @Override public int compare(Entity e1, Entity e2) { return (int)Math.signum(Mappers.index.get(e1).z – Mappers.index.get(e2).z); } } } IndexComponent implements Component { public int z = 0; }

二维体素等距渲染与非网格alignment的对象

我目前正在制作一个简单的SDL2游戏(用C ++编写),其中地图由精灵体素(基本上只是一个等距立方体的PNG)组成。 游戏实体在3D空间中移动。 世界是2D变化的基础,其中i,j,k分别是向量(96,43,0),(96,-43,0),(0,-105,0) 一切工作正常与立方体alignment到网格,[x,y,z]位置和他们的内容绘制在正确的顺序。 移动实体在最近的网格空间位置被绘制,当玩家精灵越过他们的壁橱网格的边界时导致问题。 我不知道如何解决这个问题。 我的一个想法是给玩家分配他们占据的[x,y,z]位置的列表,并且在绘制这些位置时,只绘制占据其区域的精灵的一部分。 不幸的是,我不了解如何使用SDL2来执行这些操作。 任何意见,将不胜感激,即使它不是特定于SDL的。 我相信有一个明显的解决scheme和众所周知的技术,但我迄今为止的search没有成功。