Direct3dX例外和延迟与网格使用Directx
本文关键字:网格 Directx 延迟 Direct3dX | 更新日期: 2023-09-27 18:16:32
我的directX网格有问题。当我绘制超过4-5个网格(我使用球体)时,Direct3dX异常出现在我初始化网格的地方。在这种情况下,我也有疯狂的滞后。我用c#。
这是我绘制球体的函数:
public void draw(Device device) { device.Transform.World =Matrix.Translation(v3CurMeshPos); device.Material = m; device.RenderState.Ambient = color; mesh = Mesh.Sphere(device, radius, 100, 100); // problem line mesh.DrawSubset(0); }
这是我的初始化和绘图用directX:
private void devicePanel1_OnCreateDevice(object sender, DirectxGraph.DeviceEventArgs e)
{
device = e.Device;
device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4, devicePanel1.Width / devicePanel1.Height, 1f, 1000f);
device.RenderState.Lighting = true;
device.RenderState.CullMode = Cull.None;
device.Lights[0].Type = LightType.Directional;
device.Lights[0].Position = new Vector3(10, 10, 0);
device.Lights[0].Direction = new Vector3(1, -3, -1);
device.Lights[0].Enabled = true;
}
private void updateCamera()
{
v3CamPos = new Vector3(0, 0, Util.distance);
v3CamLookAt = new Vector3(0, 0, 0);
device.Transform.View = Matrix.RotationYawPitchRoll(Util.rotX, Util.rotY, Util.rotZ) * Matrix.LookAtLH(v3CamPos, v3CamLookAt, new Vector3(0, 1, 0));
}
private void devicePanel1_OnRender(object sender, DirectxGraph.DeviceEventArgs e)
{
Draw(device);
}
private void Draw(Device device)
{
if (rotate_forward)
{
if (radioButton1.Checked)
{
Util.rotX += 0.005f;
}
else if (radioButton2.Checked)
{
Util.rotY += 0.005f;
}
else if (radioButton3.Checked)
{
Util.rotZ += 0.005f;
}
}
else if (rotate_backward)
{
if (radioButton1.Checked)
{
Util.rotX -= 0.005f;
}
else if (radioButton2.Checked)
{
Util.rotY -= 0.005f;
}
else if (radioButton3.Checked)
{
Util.rotZ -= 0.005f;
}
}
updateCamera();
if (!graph.isEmpty())
{
foreach (Node node in graph.nodes)
{
node.shape.draw(device);
}
}
}
This
mesh = Mesh.Sphere(device, radius, 100, 100); // problem line
在每一帧中创建一个新的网格。当然,这是一个很大的内存浪费,很可能导致异常。
相反,您应该在应用程序启动之前创建一次网格并重用它。你可以根据需要用世界矩阵变换它。所以你不需要为你需要的每个半径创建一个球体