2012-01-30 4 views
0

C에서 DirectX 9를 사용 중입니다.
동적 LOD 알고리즘을 사용하므로 모든 정점을 목록 (배열이 아님)에 저장하므로 모든 것이 프레임마다 계산되므로 정점 잠재적으로 모든 프레임마다 다를 수 있습니다.정점 목록에 법선 추가

법선과 조명을 추가 할 때까지 모든 것이 잘 작동합니다.
일단 정점을 목록에 추가하면 정상적인 것을 편집 할 수 없다는 것을 알았습니다. 정점은 클래스가 아닌 구조체의 목록이기 때문입니다.

vertices[i].Normal = new Vector3(0, 1, 0); 

법선가있다 - 그래서 그냥 예를 들어
나는이 작업을 수행하려고하면 같은 오류가 작동하지 않습니다 "가 변수가 아니기 때문에 blablaba의 반환 값을 수정할 수 없습니다"제공 정점이 목록에 추가 될 때 추가되지만 풀 메쉬가있을 때까지 법선을 계산할 수 없습니다.

그래서 새로운 맞춤형 버텍스 유형을 만들었고 구조체로 만드는 대신 클래스로 만들었습니다. 이것은 구조체가 아니면 directx가 받아들이지 않기 때문에 작동하지 않습니다 ...

그렇다면 정점 목록 대신 배열로 작업하려고했습니다. 이로 인해 초당 프레임 수가 1 개 미만입니다. Array.Resize를 사용하여 배열 당 크기를 프레임 당 몇 백 번 변경해야만했습니다. 그렇게 생각하지 않았습니다.

아마도 최종 목록을 배열로 바꾸고 거기에서 법선을 계산해야한다고 생각할 것입니다. 꼭지점이 특정 순서로 추가되지 않기 때문에 작동하지 않습니다. 그래서 어떤 꼭지점이 주어진 꼭지점 근처에 있는지를 알 수 없으므로 법선을 계산할 수 없습니다.

그래서 메쉬를 만든 후에 법선을 법선으로 저장할 수있는 방법으로 정점을 저장할 수 있습니까?

답변

1

C#은 사용자가 원하는대로 할 수 없기 때문에 vertices[i].Normal = new Vector3(0, 1, 0)을 쓰지 못하게합니다. 배열 인덱서와 달리 List<T> 인덱서는 지정된 요소의 복사본을 반환하며 정점이 구조체이므로 전체 정점이 Normal 및 all으로 복사됩니다. 목록 안에있는 실제 정점이 아닌 임시 정점 사본을 업데이트합니다.

var vertex = vertices[i]; 
vertex.Normal = new Vector3(0, 1, 0); 
vertices[i] = vertex; 

을 그것은 불행이 문제를 방지 할 수있는 간단한 방법이 없다는 것을 :

해결 방법은 목록에서 정점을 (사본)을 얻기를 업데이트하고 다시 (사본)를 넣어하는 것입니다 반복 복사.

+0

나는 이런 식으로 생각하게 만들지 않을 것이라고 생각했지만 완벽하게 잘 동작했다. 많은 감사 – Frobot