Nic*_*las 67
在最普遍的意义上,没有.OpenGL和Direct3D每个顶点只允许一个索引; 索引从每个顶点数据流中提取.因此,每个独特的组件组合都必须有自己独立的索引.
因此,如果你有一个立方体,每个面都有自己的法线,你需要经常复制位置和普通数据.你需要24个位置和24个法线,即使立方体只有8个独特的位置和6个独特的法线.
您最好的选择就是接受您的数据会更大.很多模型格式都会使用多个索引; 在使用它进行渲染之前,您需要修复此顶点数据.许多网格加载工具(如Open Asset Importer)将为您执行此修复.
对于D3D10/OpenGL 3.x级硬件,可以避免执行修复并直接使用多个索引属性.但是,请注意,这可能会降低渲染性能.
以下讨论将使用OpenGL术语,但Direct3D v10及更高版本具有相同的功能.
我们的想法是从顶点着色器手动访问不同的顶点属性.传递的属性实际上是该特定顶点的索引,而不是直接发送顶点属性.然后,顶点着色器使用索引通过一个或多个缓冲区纹理访问实际属性.
属性可以存储在多个缓冲区纹理中或全部存储在一个中.如果使用后者,那么着色器将需要一个偏移量来添加到每个索引,以便在缓冲区中找到相应属性的起始索引.
可以通过多种方式压缩常规顶点属性.缓冲区纹理具有较少的压缩方式,仅允许相对有限数量的顶点格式(通过它们支持的图像格式).
请再次注意,这些技术中的任何一种都可能降低整体顶点处理性能.因此,在用尽压缩或优化的所有其他选项之后,它应该仅在大多数内存有限的情况下使用.
OpenGL ES 3.0也提供缓冲区纹理.较高的OpenGL版本允许您通过SSBO更直接地读取缓冲区对象,而不是缓冲区纹理,这可能具有更好的性能特征.
我找到了一种方法可以让您减少这种重复,这种重复与其他答案中的某些陈述有点相反(但并不特别适合此处提出的问题)。然而,它确实解决了我的问题,这被认为是这个问题的重复。
我刚刚了解了Interpolation qualifiers。特别是“扁平化”。我的理解是,将平面限定符放在您的顶点着色器输出上只会导致激发顶点将其值传递给片段着色器。
这意味着对于此引用中描述的情况:
因此,如果您有一个立方体,其中每个面都有自己的法线,您将需要大量复制位置和法线数据。您将需要 24 个位置和 24 个法线,即使立方体只有 8 个独特的位置和 6 个独特的法线。
你可以有 8 个顶点,其中 6 个包含唯一的法线,2 个法线值被忽略,只要你仔细排列你的图元索引,使得“激发顶点”包含你想要应用于整个面的法线数据。
编辑:我对其工作原理的理解:
归档时间: |
|
查看次数: |
11707 次 |
最近记录: |