Articles of voxels

为BeginInvoke方法创建一个队列 – 加载块

我有一个类似于Minecraft的体素游戏。 我有一个函数PushLoadedChunks(方向),推动所有加载的块向前,向后,向左,向右。 这是用sfd.BeginInvoke(PushLoadedChunks,null,null)完成的。 这很有效,直到我快速地启动了其中的两个,如果用户进行了诊断,则会发生这种情况。 它错误出来,因为两个线程都试图修改相同的数据,都写入相同的事情,因为他们试图加载相同的块。 我想要做这样的事情: 创建一个标准线程和一个队列来推送。 我不想调用PushLoadedChunk,而是想将它添加到队列中,让单个线程一个接一个地在每个块中工作,certificate执行速度较慢但代码更稳定。 我很挣扎,因为Invoke似乎等待块返回哪个工作,但冻结我的播放器,直到它加载。 我需要参考创建sorting的“队列”,或帮助设置一个线程来运行每个方法时,他们被称为等待一个完成做另一个。 有没有人有任何建议或资源,我可以看看最好的方式来完成我的任务?

大块不完全建设

我正在尝试构建一些体素地形,但是我有一些网格的一些面加载不正确的问题。 下面是一张图片: 我认为这与我是如何得到块来绘制或如何绘制它们有关。 因此,这可以是网格管理器中的createVisualMesh函数或网格管理器中的isTransparent函数。 下面是我认为相关的所有代码,如果你需要更多的问题。 网格管理器: using System.Collections; using System.Collections.Generic; using UnityEngine; public class MeshManager : MonoBehaviour { public static ChunkManager chunkManager; public static MeshObject CreateVisualMesh(int chunkSize, BlockType[,,] blocks, MeshObject meshOb, Vector3 chunkPos, Chunk chunk) { MeshManager.chunkManager = World.currentWorld.chunkManager; Mesh visualMesh = meshOb.Mesh; MeshFilter meshFilter = meshOb.MeshFilter; MeshCollider meshCollider = meshOb.MeshCollider; List<Vector3> verts = new […]

体素性能

所以我试图做一个我的世界风格体素游戏来学习OpenGL,但我遇到性能问题。 我发现这个线程: https : //stackoverflow.com/questions/4995652/3d-occlusion-culling作者说,他正在绘制250,000立方体与一个好的帧率。 不过,我可以用相同的framerate做大约3000个。 我发现另一个线程,其中有人说,你应该把可见面组合成一个网格。 这是否意味着你把所有的顶点放入一个顶点缓冲区? 如果是这样,我如何传递纹理数据?

如何在OpenGL的着色器中创建更多的顶点?

当渲染八叉树体素时,唯一需要的信息是当前的八叉树级别,位置和颜色/纹理。 但是必须发送八个顶点到渲染管道,以渲染一个完整的立方体,仍然需要颜色/纹理。 有没有更好的办法? 由于几何着色器不会被广泛传播相当长的一段时间,在geometry-pass中的“emit_vertex”方法已经足够了(或者我错了吗?我不认为mesa目前支持几何着色器)。 而且,afaik,backface-culling在geometry-pass之前完成,所以会导致额外的开销。 我目前的想法是发送“虚拟顶点”,并有实际的绘图数据之间,但实际上不应该是解决scheme。 亲切的问候

体素引擎/顶点:如何在游戏运行时添加越来越多不同的纹理,并改变一些块的面孔?

这很难问,但我会试试。 事情是: 我曾经问过有关创建斜坡和顶点块的问题 。 [我正在使用C#/ XNA。] 说明:现在我得到了一个块,无论我想要的块,自动将“楼梯”变成坡道。 我喜欢它,我感谢所有帮助我的人! 但是我不知道如何适当的纹理。 我可以添加一个纹理地图集,并设置每个纹理的坐标(我在一个名为“TechCraft Engine”的项目中find了这个例子),但是我想为每个纹理创建单独的PNG文件,因为稍后我会使用透明度我希望纹理可以在游戏运行时加载。 我是编程新手,但我正在寻找解决scheme。 所有我现在得到的是,我有一个自定义效果(FX文件)创建,每一天的时间更改颜色。 但它只有一个纹理文件加载的插槽。 而且因为这个原因,我还是无法实现。 我不能添加更多的纹理采样器的效果,因为它不能在游戏运行时完成(或可以吗?) 我正在使用VertexBuffers和IndexBuffers,以及TriangleList原语。 现在,我只能用颜色绘制,没有纹理。 后来在我的游戏中,我希望可以添加自定义纹理并将其放置在块的某些面上。 这个例子可以在“模拟人生3”中find。你可以在游戏中添加纹理,并用它来绘制墙壁和物体。 这是我想创建的东西,但是在玩游戏时加载一个装载程序。 我的问题是:我应该为每个纹理创建一个VertexBuffer和一个IndexBuffer,并用它们之间的每个纹理分隔顶点,创建VertexBuffer和IndexBuffer列表来放置每个纹理?然后我可以绘制一个纹理的所有顶点一次,用另外一个改变效果的纹理参数(再次调用pass技术),并用列表的下一个VertexBuffer和IndexBuffer再次设置graphics设备,用TriangleList原语绘制它。 我会重复每个纹理加载。 它工作还是有任何其他的方式来做到这一点? 现在是否应该忘记运行时加载,以便find更简单的解决scheme? 我很困扰这个,你有什么建议吗? 任何信息将有所帮助。 谢谢!

贪婪的网格生成一个基于体素的游戏

编辑:我已经find了我的问题,并修复它(但我不能接受我自己的答案另外2天) 我目前正在制作一个基于三维体素的游戏,现在我已经开始优化渲染引擎的某些方面了,我遇到了一个我的网格生成问题。 我的体素世界被分为16x16x16分段; 这些部分包含块和一些更多的数据,这些数据可以帮助我确定段是否可见。 块也有一些关于它的可见性和BlockType ; 块types基本上保存块的颜色和其他一些重要信息。 我目前只渲染块的顶部,底部和左侧。 但是不管怎么样,当网格生成有问题的时候,当前块上面和下面都有空的块。 (在你面对的图像+ x + z) 正如你在上面的图片中看到的那样,有几排突出的部分不应该在那里。 (红色是不应该在那里) 这是我的代码: private static HashMap<Integer, ArrayList<WorldVertex>> vertices = new HashMap<Integer, ArrayList<WorldVertex>>(); private static HashMap<Integer, ArrayList<Integer>> indices = new HashMap<Integer, ArrayList<Integer>>(); … public static void processSegment(Segment segment) { BlockType[] mask = new BlockType[4096]; boolean[] done = new boolean[4096]; Block block; BlockType type; […]

什么algorithm用来select体素(从玩家的角度来看)?

在第一人称体素游戏(如下图所示)中,您可以通过查看体素来select体素。 什么样的algorithm被用来select体素? 我还没有在我的voxel应用程序中实现它,但我能想到的唯一的解决scheme是投射线和检查交叉点,但它似乎效率非常低。

将体素types数据存储在XML或Java类中?

所以,我希望能够很容易地创建我的游戏的所有实体,并让其他人进入并执行相同的操作。 我想我可以让用户/我自己创建一个XML表来存储每个块的所有属性(如Terraria或Minecraft体素),并添加在XML中引用的Lua脚本以获得任何块的附加function。 我开始认为让用户创建一个充满每个块的类的JAR文件会更容易。 然后,可以很容易地使用JAR文件来获取所有的块。 通过块ID引用所有块而不用ID存储所有类是很有意思的。 或者我可以给每个类一个静态的ID。 但是这并不重要。 好的,所以我的简短问题是什么是存储所有不同types的块作为类的优点和缺点与在Lua的XML表单中添加额外的function? 更新:我可能会去唯一使用Lua方法。 我刚刚发现它,似乎它可能是现在对我来说最好的方法!

稀疏体素八叉树在GPU或CPU部分?

我目前正在研究构建自己的体素引擎,并发现很多提及SVO的文章是最好的机制。 我只是想知道,我正确理解algorithm之前,我执行它。 我把我的数据读入CPU的八叉树,通过标准的node-> children构造来维护。 用这个我可以做碰撞检测,截锥体剔除等 为了渲染八叉树,然后将其写入到纹理,并由顶点和像素着色器进行处理,以直接在GPU上显示实际的体素。 虽然我猜我可以在CPU上走八叉树,而不是构建纹理,但通过实例化绘制单个体素,尽管可能会慢一些。 这是正确的还是我误解?

如何使用单纯的噪声2D创建无缝和连贯的体素地形?

我使用单工噪音2d插件虚幻引擎4,这也是大多数程序员都能理解的。 我已经实现了块生成和双块噪声提升。 然而,每个块都有一个独特的高度图,这导致锯齿状的体素地形。 伪代码: //Chunk.cpp for(int chunkWidth = 0; chunkWidth <= 10; chunkWidth++){ for(int chunkHeight = 0; chunkHeight <= 10; chunkHeight++){ noiseX = ((chunkWidth / 10) – 0.5) * Frequency; noiseY = ((chunkHeight / 10) – 0.5) * Frequency; Elevation = SimplexNoise2D(noiseX, noiseY) * 100; ChunkLoc = getActorLocation(self); SpawnMeshAtLoc(ChunkLoc.x + chunkWidth, ChunkLoc.y + chunkHeight, Elevation); […]