如何在opengl中不使用数百万个三角形来绘制风景?

Rom*_*huk 2 c++ opengl

我创建了一个程序(C++/OpenGL),它使用 OpenSimplex 噪声生成景观并将其绘制为一个网格(因此我必须每帧仅调用一次绘制函数)。我正在使用glDrawElements函数。网格包含 1023 * 1023 个矩形 = 1023 * 1023 * 2 个三角形,景观看起来像 PS1 游戏中的一样,并使用超过 500 MB 的 RAM。如何在不使用这么多三角形的情况下制作平滑的景观(就像在现代游戏中一样)?

编辑:拥有少量不同详细的 VBO,并从最详细的 VBO 绘制最近的三角形,从不太详细的 VBO 绘制较远的三角形,是否会有效?

rob*_*oke 6

现代游戏通常使用一系列技术来渲染高质量的场景。

  1. 视锥体剔除(丢弃不在屏幕上的三角形)。这通常涉及将您的 GEO 分成许多较小的块,当它们在屏幕上不可见时可以忽略它们。
  2. 地理 Mip 映射(用较低 LOD 版本替换远处的地理区域,用高分辨率版本替换近处的地理区域)。通常,这仅涉及为给定的 LODS 重新使用一组预定义的索引(其中基础顶点数据保持不变,但索引数据指定最高 LOD 的每个顶点,第二个 LOD 的每个其他顶点,第二个 LOD 的每个第 4 个顶点)第三个 lod,依此类推)
  3. 曲面细分着色器(向一些 GEO 添加更多三角形以平滑粗糙边缘)
  4. 凹凸/法线贴图(或其他每像素光照效果)。使用纹理数据为正在渲染的三角形添加更多表面变化。

基本上,如果你想要平滑的 GEO,你需要添加

  1. 更多三角形,或者
  2. 附加纹理数据(例如法线或位移贴图)。

诀窍是最大限度地减少渲染给定帧所需的三角形数量,而不是担心总共有多少个三角形。

ps 1024 * 1024 * vec3 是 18Mb 顶点数据(+18Mb 普通数据,+24Mb 索引数据)。如今,我们有数千兆的内存可用于 GPU,因此几兆并不是什么大问题。同样,Geo-Mipmapping 会将索引数据量减少到最低限度。