opengl - 渲染具有多个索引的网格

标签 opengl opengl-es webgl direct3d vulkan

我有一些顶点数据。位置、法线、纹理坐标。我可能从 .obj 文件或其他格式加载它。也许我正在画一个立方体。但每条顶点数据都有自己的索引。我可以使用 OpenGL/Direct3D 渲染此网格数据吗?

最佳答案

从最一般的意义上来说,不是。 OpenGL 和 Direct3D 只允许每个顶点有一个索引;索引从每个顶点数据流中获取。因此,每个独特的组件组合都必须有自己单独的索引。

因此,如果您有一个立方体,其中每个面都有自己的法线,则您将需要大量复制位置和法线数据。您将需要 24 个位置和 24 个法线,即使立方体只有 8 个唯一位置和 6 个唯一法线。

您最好的选择就是简单地接受您的数据将会更大。很多模型格式都会使用多个索引;您需要先修复此顶点数据,然后才能使用它进行渲染。许多网格加载工具(例如 Open Asset Importer)将为您执行此修复。

还应该注意的是,大多数网格都不是立方体。大多数网格在绝大多数顶点上都是平滑的,只是偶尔有不同的法线/纹理坐标/等。因此,虽然简单的几何形状经常出现这种情况,但真实模型很少有大量的顶点重复。

GL 3.x 和 D3D10

对于 D3D10/OpenGL 3.x 级硬件,可以避免执行修复并直接使用多个索引属性。但是,请注意,这可能会降低渲染性能。

以下讨论将使用 OpenGL 术语,但 Direct3D v10 及更高版本具有等效功能。

这个想法是从顶点着色器手动访问不同的顶点属性。传递的属性实际上是该特定顶点的索引,而不是直接发送顶点属性。然后,顶点着色器使用索引通过一个或多个 buffer textures 访问实际属性。 .

属性可以存储在多个缓冲区纹理中,也可以全部存储在一个缓冲区纹理中。如果使用后者,则着色器将需要向每个索引添加一个偏移量,以便在缓冲区中找到相应属性的起始索引。

常规顶点属性可以通过多种方式进行压缩。缓冲区纹理的压缩手段较少,仅允许相对limited number of vertex formats (via the image formats they support).

请再次注意,任何这些技术都可能会降低整体顶点处理性能。因此,它应该只在内存最有限的情况下使用,在所有其他压缩或优化选项都已用尽之后。

OpenGL ES 3.0 也提供缓冲区纹理。更高的 OpenGL 版本允许您通过 SSBOs 更直接地读取缓冲区对象而不是缓冲区纹理,它可能具有更好的性能特征。

关于opengl - 渲染具有多个索引的网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55793679/

相关文章:

three.js - 为什么需要在 webgl 着色器中定义精度值?

cocoa - CAOpenGLLayer 显示远程上下文

c++ - 将顶点缓冲区对象附加到顶点数组对象

c++ - OpenGL 检查是否启用或禁用了某些东西

opengl-es - 如何在OpenGL ES 2.0中绘制反锯齿线?

objective-c - OpenGL ES/iPhone 开发问题-第一场比赛

graphics - 绘制像素化的纹理

c++ - 自从移动到 64 位后,我在随机 glVertexAttribArray 调用中从 nvoglv64.dll 获得了访问冲突

java - 如何在 opengl es 2.0 中设置 2D 游戏的深度范围?

javascript - 在 WebGL 中只绘制网格的一部分