OpenTK と winforms を使用してポイントを選択する小さな C# サンプルを開発しました。
正方形を描画する方法と、三角形を選択する別の方法があります。どういうわけか、私はヒットを取得していません。Readpixel メソッドに問題はありますか? 正しい方法で Tao のピッキング サンプルを OpenTK に変換したからですか? 私の方法のどこが間違っているのか教えてください。
private static int[,] board = new int[3, 3]; //Definition
private const int BUFSIZE = 512;
private void glControl1_MouseDown(object sender, MouseEventArgs e)
{
int[] selectBuffer = new int[BUFSIZE]; //This has to be redifined
int hits;
int[] viewport = new int[4];
if (e.Button == MouseButtons.Left)
{
GL.GetInteger(GetPName.Viewport, viewport);
GL.SelectBuffer(BUFSIZE, selectBuffer);
GL.RenderMode(RenderingMode.Select);
GL.InitNames();
GL.PushName(0);
GL.MatrixMode(MatrixMode.Projection);
GL.PushMatrix();
GL.LoadIdentity();
Byte4 Pixel = new Byte4();
GL.ReadPixels(e.X, viewport[3] - e.Y, 1, 1, PixelFormat.Rgba, PixelType.UnsignedByte, ref Pixel);
uint SelectedTriangle=SelectedTriangle = Pixel.ToUInt32();
GL.Ortho(0, 3 ,0, 3, 1,-1); // Bottom-left corner pixel has coordinate (0, 0)
DrawSquares(GL.RenderMode(RenderingMode.Select));
GL.MatrixMode(MatrixMode.Projection);
GL.PopMatrix();
GL.Flush();
hits = GL.RenderMode(RenderingMode.Render);
ProcessHits(hits, selectBuffer);
glControl1.SwapBuffers();
}
}
private static void DrawSquares(int mode)
{
int i, j;
for (i = 0; i < 3; i++)
{
if (mode == GL.RenderMode(RenderingMode.Select))
GL.LoadName(i);
for (j = 0; j < 3; j++)
{
if (mode == GL.RenderMode(RenderingMode.Select))
GL.PushName(j);
GL.Color3((float)i / 3.0f, (float)j / 3.0f, (float)board[i, j] / 3.0f);
GL.Rect(i, j, (i + 1), (j + 1));
if (mode == GL.RenderMode(RenderingMode.Select))
GL.PopName();
}
}
}