Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向顶点列表添加法线_C#_List_Directx_Normals - Fatal编程技术网

C# 向顶点列表添加法线

C# 向顶点列表添加法线,c#,list,directx,normals,C#,List,Directx,Normals,我在C# 我将所有顶点存储在一个列表(而不是数组)中,因为我使用了动态LOD算法,所以每帧都会计算所有顶点,所以每帧的顶点可能都不同 在我尝试添加法线和照明之前,一切正常。 我发现,一旦向列表中添加顶点,就无法编辑法线,因为它是结构列表而不是类列表。所以它只给出了一个错误,比如“不能修改blaba的返回值,因为它不是一个变量” 例如,如果我尝试这样做,它将不起作用- vertices[i].Normal = new Vector3(0, 1, 0); 将顶点放入列表时,必须添加法线,但在拥有完

我在C#
我将所有顶点存储在一个列表(而不是数组)中,因为我使用了动态LOD算法,所以每帧都会计算所有顶点,所以每帧的顶点可能都不同

在我尝试添加法线和照明之前,一切正常。
我发现,一旦向列表中添加顶点,就无法编辑法线,因为它是结构列表而不是类列表。所以它只给出了一个错误,比如“不能修改blaba的返回值,因为它不是一个变量”
例如,如果我尝试这样做,它将不起作用-

vertices[i].Normal = new Vector3(0, 1, 0);
将顶点放入列表时,必须添加法线,但在拥有完整网格之前,无法计算法线

因此,我创建了一个新的自定义顶点类型,并没有将其设置为结构,而是将其设置为类。这也不起作用,因为directx不会接受它,除非它是一个结构

然后我试着用数组来代替顶点列表。这导致每秒少于一帧。我不得不使用Array.Resize来改变数组的大小,每帧改变几百次,我猜它不喜欢这样

你可能认为我应该把最后的列表变成一个数组,然后从那里计算法线。这将不起作用,因为顶点没有按任何特定顺序添加,所以我无法知道哪些顶点靠近给定顶点才能计算法线

那么,我如何存储顶点,以便在构建网格后为它们提供法线呢?

C#阻止您写入
顶点[I]。Normal=new Vector3(0,1,0)
,因为该表达式不能满足您的要求。与数组索引器不同,
列表
索引器返回指定元素的副本,并且由于顶点是结构,因此将复制整个顶点、
普通
和所有。您将更新顶点的临时副本,而不是列表中的实际顶点

解决方法是从列表中获取顶点(副本),对其进行更新,然后将其(副本)放回:


不幸的是,没有简单的方法可以避免这种重复复制。

我完全没有想到它会让我这样做,但它工作得非常好。非常感谢
var vertex = vertices[i];
vertex.Normal = new Vector3(0, 1, 0); 
vertices[i] = vertex;