私はまだ DirectX にかなり慣れていませんが、C# 内で特別なファイル形式をレンダリングするという目標に近づいています。最後のハードルが 1 つあります。ファイルを解析してメッシュ オブジェクトにするコードを書きました。複数のテクスチャをレンダリングできるようにするためにこれを行いました。前に述べたように、私は DirectX に比較的慣れておらず、メッシュ オブジェクトをゼロから作成したことはありません。私はインターネットをよく見て、ゼロから作成する方法をよりよく理解しようとしました。ただし、このテーマに関する多くのチュートリアルはサブメッシュを扱っておらず、Microsoft 自身のドキュメントでさえ不足しています。私が抱えている問題は、モデルが正しくレンダリングされていないことです (以下を参照)。AttributeRanges のプロパティが正しいかどうかは本当にわかりません。または、インデックスが全体として正しくありません (すべてのモデルをレンダリングする場合)。
除外できることの 1 つは、データの有効性です。私のデータが正しいことは 100% 確信しています。頂点の位置、テクスチャ マッピング、およびインデックス (個別のモデルごとに頂点データを修正)。ループを調整して、最初のモデルのみをレンダリングするとします。これが私の結果です。
これが私のコードです。私はそれが厄介であることを知っています:|
public void RenderModel(Model[] models,bool isTextured = false,bool wireFrame = false)
{
//Model object contains all vertex data and indices for that model
//The indices do not hold any relation to other models.
this.modelss = models;
int vertexCount = 0;
for (int currentModelID = 0; currentModelID < models.Length; currentModelID++)
{
Model model = models[currentModelID];
vertexCount += model.renderDataSource.vertices.Length;
AttributeRange range = new AttributeRange();
range.AttributeId = currentModelID;
range.FaceCount = model.getIndices().Length / 3;
range.FaceStart = Indices.Count /3;
range.VertexCount = model.getTexturedVertices().Length;
range.VertexStart = vertices.Count;
this.vertices.AddRange(model.getTexturedVertices());
this.Indices.AddRange(model.getIndices());
Console.WriteLine("ID: " + range.AttributeId + " FaceCount: " + range.FaceCount + " FaceStart: " + range.FaceStart + " vercount " + range.VertexCount + " verstart: " + range.VertexStart );
attributeRanges.Add(range);
}
this.vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionNormalTextured),vertices.Count,
device, Usage.Dynamic | Usage.WriteOnly, CustomVertex.PositionNormalTextured.Format, Pool.Default);
vertexBuffer.SetData(vertices.ToArray(), 0, LockFlags.None);
getTextures();
this.indexBuffer = new IndexBuffer(typeof(ushort), Indices.Count, device, Usage.WriteOnly, Pool.Default);
indexBuffer.SetData(Indices.ToArray(), 0, LockFlags.None);
int faces = Indices.Count /3;
int verCount = vertices.Count;
model3d = new Mesh(Indices.Count /3 , vertices.Count, MeshFlags.SystemMemory,CustomVertex.PositionNormalTextured.Format, device);
model3d.IndexBuffer.SetData(Indices.ToArray(), 0, LockFlags.None);
model3d.VertexBuffer.SetData(vertices.ToArray(), 0, LockFlags.None);
model3d.SetAttributeTable(attributeRanges.ToArray());
Render(isTextured);
}
private void Render(bool isTextured)
{
float x = (float)Math.Cos(rot);
float z = (float)Math.Sin(rot);
device.BeginScene();
setupLightingAndCamera();
device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, this.Width / this.Height, 1f, 50f);
device.Transform.View = Matrix.LookAtLH(new Vector3(x, 8, z), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
DrawMesh();
device.EndScene();
}
private void DrawMesh()
{
for (int i = 0; i < modelss.Length; i++)
{
Model model = modelss[i];
material = new Material();
material.Diffuse = Color.White;
material.Specular = Color.LightGray;
material.SpecularSharpness = 15.0F;
device.Material = material;
//Just obtains correct file from info in dictionaries
device.SetTexture(0, textures[textureName[model.renderDataSource.shader]]);
model3d.DrawSubset(i);
}
}
最後に、デバッグの出力を示します。役立つ場合があります。
ID: 0 FaceCount: 22 FaceStart: 0 vercount 34 verstart: 0
ID: 1 FaceCount: 16 FaceStart: 22 vercount 24 verstart: 34
ID: 2 FaceCount: 16 FaceStart: 38 vercount 24 verstart: 58
ID: 3 FaceCount: 16 FaceStart: 54 vercount 24 verstart: 82
ID: 4 FaceCount: 446 FaceStart: 70 vercount 562 verstart: 106
ID: 5 FaceCount: 1176 FaceStart: 516 vercount 900 verstart: 668
ID: 6 FaceCount: 28 FaceStart: 1692 vercount 32 verstart: 1568
ID: 7 FaceCount: 47 FaceStart: 1720 vercount 76 verstart: 1600
ID: 8 FaceCount: 28 FaceStart: 1767 vercount 32 verstart: 1676
ID: 9 FaceCount: 47 FaceStart: 1795 vercount 76 verstart: 1708
ID: 10 FaceCount: 94 FaceStart: 1842 vercount 90 verstart: 1784
あらゆる種類の助けをいただければ幸いです。ありがとうございました