また、ILNumerics OpenGL ドライバーを使用しようとしましたが、Intel HD4000 を使用しています。同じエラーが発生し、デバッグ ログには、glDrawElements 呼び出しで ILNumerics がクラッシュしたことが示されます。
OpenGL ドライバーがクラッシュしないように、ilPlotCube を初期化するときに回避策を見つけました。NuGet の Window Forms ilPanel コントロールと ilNumerics 3.2.2.0 を使用しています。
- ilPanel_load イベントで ilPlotCube を作成し、x 軸のスケールを対数に設定します。プロットキューブをシーンに追加します。
- ilPoint 要素をプロットキューブに追加します。ランダムなデータで埋めます。
私にとっては、これが実行され、クラッシュすることなく OpenGL ドライバーを使用してプロット コントロールが読み込まれます。
void ilPanel1_Load(object sender, EventArgs e)
{
var pc = new ILPlotCube(twoDMode: false);
// Set an axis scale to logarithmic so the GL driver will not crash
pc.ScaleModes.XAxisScale = AxisScale.Logarithmic;
// Create a new scene
var scene = new ILScene();
scene.Add(pc);
this.ilPanel1.Scene = scene;
// Add points to the scene so the GL driver will not crash
this.AddPoints();
}
/// <summary>
/// Add an ILPoints object so GL driver will not crash
/// </summary>
private void AddPoints()
{
var pc = ilPanel1.Scene.First<ILPlotCube>();
ILArray<float> A = ILMath.tosingle(ILMath.rand(3, 1000));
var points = new ILPoints
{
Positions = A,
Colors = A,
Size = 2,
};
pc.Add(points);
this.points = points;
}
コントロールが OpenGL ドライバーで正常に読み込まれる場合は、ポイント要素をシーンから削除します。必要に応じて軸スケールを設定します。プロットしたい実際のものをプロットする別のチャート要素を追加します。
// Remove the ILPoints shape
if (this.points != null && ilPanel1.Scene.Contains(points))
{
ilPanel1.Scene.Remove(this.points);
this.points = null;
}
// Set the axis scale back to linear
var pcsm = ilPanel1.Scene.First<ILPlotCube>().ScaleModes;
pcsm.XAxisScale = AxisScale.Linear;
// Add actual plots here