【发布时间】:2012-01-30 02:59:16
【问题描述】:
我在 C# 中使用 DirectX 9
我将所有顶点存储在一个列表(不是数组)中,因为我使用动态 LOD 算法,所以所有内容都是每帧计算的,所以我的顶点可能每帧都不同。
在我尝试添加法线和光照之前,一切正常。
我发现一旦将顶点添加到列表中,就无法编辑法线,因为它是结构而不是类的列表。所以它只会给出一个错误,比如“无法修改 blablaba 的返回值,因为它不是变量”
例如,如果我尝试这样做,它将无法正常工作 -
vertices[i].Normal = new Vector3(0, 1, 0);
在将顶点放入列表时必须添加法线,但在拥有完整网格之前无法计算法线。
所以我创建了一个新的自定义顶点类型,而不是把它变成一个结构,而是把它变成了一个类。这也不起作用,因为directx不会接受它,除非它是一个结构......
然后我尝试让它使用数组而不是顶点列表。这导致每秒少于一帧。我不得不使用 Array.Resize 每帧将数组的大小更改几百次,我猜它不喜欢那样。
你可能在想我应该把最终的列表变成一个数组,然后从那里计算法线。这不起作用,因为顶点不是以任何特定顺序添加的,所以我不知道哪些顶点靠近给定顶点以便能够计算法线。
那么,我如何存储我的顶点,以便在我构建网格后赋予它们法线?
【问题讨论】: