2013-12-08 43 views
2

我有关于glDraw(阵列)的一个问题(单元)。事实是,大多数人说元素是更有效的,由于顶点重用和缓存,但我尝试呈现地形,每个顶点具有相同位置的不同纹理坐标。 THAT使每个顶点唯一的权利?所以,如果我没有任何顶点重用,我应该更喜欢的阵列,因为它更容易实现并呈现在一个缓冲区去相比,我不仅需要与顶点数据,而且索引缓存提供元素? 而且是有办法来渲染地形,这使得它能够使用元素?我只是没有得到如何正确地纹理地形,也许这是问题。OpenGL的索引和Array纹理

我能想象绘制者的车型将与元素很好的,因为我可以提供一个纹理文件,而不是需要每个顶点的位置更TEX COORDS。但地形应该与数组呈现?

我什么时候应该选择阵列,当元素?

回答

3

地形glDrawElements是要走的路,假设你有一个简单的2D网格,你取代它的顶点着色器或发送的高度为顶点attribs。这比这种网格的glDrawArrays快得多。

对于纹理:我不知道是否想要纹理与一个大或多个纹理混合在一起的地形,例如一个简单的草图案,或草地融合雪增加高度。

第一个很容易:可以说你的地形的宽度是W,高度是H.你在整个地图上使用了一个大的纹理那么对于一个顶点纹理坐标为:

vec2 TexCoord = vec2(VertexPos.x/W,VertexPos.z/H); 

对于第二个它改变了一下:

如果您质地是一个简单的草瓷砖,或任何你想要覆盖全地形用,那么顶点的纹理坐标为:

vec2 TexCoord = vec2(VertexPos.x/XdirectionTileSize,VertexPos.z/ZdirectionTileSize); 

XdirectionTileSizeZdirectionTileSize是一个PA的尺寸ttern。例如,您想要以1米* 1米的分辨率在地形上获取草地纹理,并且您的顶点距彼此相距2米,然后将它们设置为0.5(1/2)。

对于更多纹理您可以定义更多瓷砖尺寸和一个大纹理贴图,每个颜色定义一种材质。例如:红色是草,蓝色是雪,绿色是沙子,阿尔法是岩石。然后你混合纹理这样的:(您可以这个大材质贴图就像一个大纹理)

color = materialmap.r*grass + materialmap.b*snow + materialmap.g*sand + materialmap.a*rock; 

最后我最喜欢的地形贴图方法是程序着色器泼溅 。我不会在这里写。例如Frostbite引擎(战地)使用这个。这是一个非常好的演示文稿的链接:http://dice.se/publications/terrain-rendering-in-frostbite-using-procedural-shader-splatting/。总之它就像掩蔽。将高度,法线,斜率渲染为FBO纹理,并在延迟渲染/着色中使用它。

对于质量:如果您的texcoords在着色器中的顶点位置在平面上(.xy,.xz)进行计算,它可能会使纹理以斜率递增的方式变形。这个问题的解决方案是triplanar纹理。页面底部:http://http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html。简而言之:它将纹理从3个平面(xz,xy,yz)投影到地形,并将它们与法线混合/混合。

当然,你可以混合这些纹理方法。我知道它不直接回答你的问题,但我认为你不应该把纹理坐标作为顶点属性。使用大纹理,瓷砖或溅射来定义它们更容易。哦,我希望你使用着色器;)。

+0

这非常有帮助!您间接回答了我的一个大问题,即如何使用元素或数组高效渲染地形。谢谢! – user209347