Articles of 地形渲染

如何管理平截头剔除

我有一个基于球形剪贴图的行星地形。 整个行星是由一个单位的环形几何形状组成,顶点着色器移动以覆盖整个600万单位半径的行星。 但是,只要这个几何体的起点不在相机的视野中(这是行星的99.9999%),就会被剔除。 什么是最好的解决scheme,以确保即使原来的网格是不可见的行星是可见的? 这是基于WebGL和Three.js 。

libgdx:你如何从TiledMap中移除一个单元格?

我正在做一个开放的世界Terraria式sidescrolling游戏。 我正在使用TiledMap来渲染所有的图块。 如果我想删除一个瓷砖,如果它是坏的,我将如何阻止它被渲染?

使用2D地图进行3D游戏的等级编辑

我们正在尝试为3D游戏制作关卡编辑器,这个游戏涉及在室外环境中行走。 在很多方面,高度图满足游戏的需求,但是在很多方面也存在不足,所以我们正在考虑对高度图概念进行各种改进,但是很难find解决这个问题的简单方法。 一开始,一个高度图有很大的难度和尖锐的边缘。 只要一切顺利,高度图看上去很美,但是沿着垂直的悬崖,沿着道路的边缘,以及高度图的分辨率变得相关的任何地方,都会变得锯齿状。 这些问题的明显解决scheme是在高度图顶部添加一个vector绘图层,所以我们可以精确地定义垂直悬崖和道路的曲线,并使用它将专门的多边形插入到地形的网格中。 垂直悬崖甚至可以是地形网格中的一个简单的间隙,可以用另一个网格填充,这样我们就可以渲染悬崖面,不过我们喜欢这样做,绕过了海格图通常具有的局限性。 高度贴图的另一个问题是手工绘制平滑斜坡的难度。 对于游戏的目的,地形应该是一个缓坡或一个垂直的悬崖,所以没有模棱两可的问题,玩家是否可以穿越它。 我们可以扫描高度图以检测过度陡峭的斜坡并显示错误消息,但我们真正想要做的是给用户绘制工具,只会绘制可接受的斜坡。 但是,这怎么办呢? 也许传统的栅格高度图会导致比解决更多的问题,所以需要完全不同的高度图。 也许不是添加一个vector绘图层,而是将整个高度图作为一个vector图像来表示,并且用一组多边形表示,每个多边形都有一定的高程。 这样我们就可以自动获得平滑的曲线,为垂直悬崖和平坦的土地创建网格是微不足道的,但是在编辑器中呈现斜坡并渲染它们成为一个挑战。 我们已经考虑过在第二层绘制多边形的混合工具,无论这些混合多边形出现在哪里,底层的地形多边形都会平滑地合并在一起。 具有共享边缘的多边形将从与这些边缘垂直的斜坡以一定角度倾斜,从而使斜坡可行。 不幸的是,生成网格的几何graphics是困难的,这意味着悬崖是每个海拔变化的默认值。 由于用户画线来阻止玩家的通过似乎更自然,而不是画出玩家可以穿越的地方,所以另一种方法是让用户像在栅格高度图中那样在另一图层中画出悬崖线,但是现在那些悬崖峭壁将会阻止地形变成纯净的连绵起伏的丘陵。 将高度图的每个多边形设想为具有垂直边的沙子的支柱,并且当从地graphics成网格时,沙子从其支柱stream出,除了遇到悬崖线并且被迫stream动之外,在每个方向上形成平滑的斜坡周围。 除了悬崖之外,任何地方都需要有足够的坡度向上走,所以当悬崖上有缝隙的时候,沙子需要stream过并在另一边铺开。 我们对如何实现这个目标有一些想法,但这仍然是一个重大的挑战。 最后,我们可以用一个斜坡块来表示斜坡。 编辑将是容易的,生成网格将是容易的,所有的问题将被解决,但被限制在一个网格肯定会牺牲我们希望拥有的自由。 除非没有其他解决scheme是可行的,否则我们不希望受限于轴alignment。 最终的问题是:是否有切实可行的方法来实施我们正在考虑的任何方法,还是我们从完全错误的方向来实现?

使用纹理数组的多纹理algorithm

我想multitexture地形网格。 我有纹理数组中的16个纹理。 对于每个顶点我有每个纹理的权重。 我只关心每个顶点的两个最显着的纹理。 例如,如果一个纹理的草的强度为0.6 ,土的强度为0.3 ,岩石的强度为0.1 ,那么可以忽略岩石并将草和土的总和归一化到1.0 。 最简单的解决scheme是存储每个顶点中每个纹理的权重,并基于每个纹理的权重混合所有纹理 for(int i = 0; i< 16; i++) color += sampled_ith_textue * ith_texture_weight; 它可以工作,但是由于它需要16个样本,所以速度很慢。 使用normalmap,glossmap,heightmap和…它可以像2 * 16或3 * 16样本一样上升。 那么有没有更好的解决scheme呢? 正如我所说,只考虑两个最重要的纹理是很好的。 Nvidia有一个例子,只是做了这个( 页面 ),但是当两个相邻的顶点有不同的纹理,它会导致文物。 有什么建议么?

在运行时创建TIN

在我们正在构建的可视化中,我们正在考虑在运行时基于将被加载到软件的点创建TIN显示。 点是3D(xyz),因此TIN也是3D。 我已经看到这个线程在FPS游戏中基于TIN的地形格式的例子,但它看起来像图书馆从网格创建TIN,而不是从点。 我读了德劳内三角剖分,可以很容易地开发代码,但所有的例子都是2D(xy)。 有没有人在运行之前开发3D TIN,并可以建议?

在Unity3D中创建一个2D地形

我正在尝试在Unity中制作可在“场景”视图中编辑的2D地形。 我遇到了这个github仓库,这是非常符合我的要求,但我不知道我能做些什么才能让它在顶层有另一个纹理来创建平台的幻想。 我已经广泛search,没有find任何。 我不是在寻找付费的解决scheme,如Ferr2D,Zippy地形2D地形造物主等。我希望地形能够有曲线和样条等谢谢。

如何处理统一的大地形分辨率的锐利边缘?

所以首先我使用一个.raw文件来生成我的地形,这部分工作很好。 我的主要问题是,当我将地形的宽度和高度改为5000时,地形变得如此拉伸,看上去很低。 基本上所有的边缘和悬崖是令人难以置信的锐利,不光滑。 我非常感谢任何答案,因为我难住。

帮助开放GL地形

我有一个像这样的地形类: class Terrian { public: Terrian(int width, int height); virtual ~Terrian(); GLuint get_vertexbuffer(); GLuint get_colorbuffer(); GLuint get_elementbuffer(); protected: private: Vector3 **terrian_vertices; Color **terrian_colors; GLushort *terrian_elements; GLuint vbo_terrian_vertices; GLuint vbo_terrian_colors; GLuint ibo_terrian_elements; GLint width; GLint height; void construct_vertices(); void construct_buffers(); void construct_elements(); }; 我的问题是,地形从来没有显示,我不知道我是否做了任何不正确的事情,但这里是如何生成顶点(我注释了实际的代码,并创建一个盒子)。 void Terrian::construct_vertices() { terrian_vertices = new Vector3*[8]; terrian_colors = new Color*[8]; /* […]

渲染一个dynamic大小的岩石

我正在开发一个拥有大型可变形地形的2D手机游戏(很像虫子)。 我使用灰度位图(在片段着色器中)渲染地形,用作纹理位置图。 如果位图中的像素是黑色的,我用地面(平铺)纹理渲染像素,否则我渲染背景纹理。 这工作得很好,但现在我想添加岩石和静态图像的地形。 岩石看起来像这样 所以我的想法是将灰度位图扩展为RGB位图,并使用绿色通道标记岩石形状和蓝色通道,以标记静态图像(不平铺)的位置。 由于静态图像是不可重复的,我将不得不创建与静态图像大小完全相同的蓝色矩形。 这可以做任何其他方式吗? 对于岩石我会使用一个类似的方法,但与绿色通道,所以如果位图中的像素是绿色,我会渲染该岩石纹理像素(边缘模糊的位graphics状呈现黑色边框)。 岩石纹理是靠近图片黑色边框的深灰色。 但问题是,现在的岩石是一个黑色边框的纯色,我想尽可能接近的图片。 是否有可能创建一个纹理来获得与图片上相同types的阴影? 或者还有其他的方式吗? 谢谢!

高度地图呈现颠倒和/或倒退

按照这里find的教程: http : //www.riemers.net/eng/Tutorials/XNA/Csharp/Series1/VertexBuffer_and_IndexBuffer.php 这个页面底部的代码是我正在使用的。 (我已经改变了一些事情,试图解决这个问题,所以我的代码和这不完全相同)。 我注意到,高度贴图实际上是颠倒的。 例如,如果我在高度图上写了“hello”,绘制的时候字母就会颠倒过来。 经过一段时间的摆弄之后,我看不出问题所在,而且这些字母总是会出现倒退或倒置,或者两者兼而有之。 基本上我只是试图让高度图的顶部绘制在北方(+ Z或-Z,最后的方向对我来说并不重要)。 private void LoadHeightData(Texture2D heightMap) { terrainWidth = heightMap.Width; terrainHeight = heightMap.Height; Color[] heightMapColors = new Color[terrainWidth * terrainHeight]; heightMap.GetData(heightMapColors); heightData = new float[terrainWidth * terrainHeight]; for (int i = 0; i < heightData.Length; i++) heightData[i] = heightMapColors[i].R; } private void SetUpVertices() { vertices = […]