C# OpenTK鼠标拾取

C# OpenTK鼠标拾取,c#,opentk,mouse-picking,C#,Opentk,Mouse Picking,我开发了一个小的C#示例,通过使用OpenTK和winforms来选择要点 有一种方法可以画正方形,还有另一种方法可以拾取三角形。不知何故,我没有得到任何点击。Readpixel方法有什么问题吗?因为我刚刚用正确的方法将Tao picking示例转换为OpenTK?你能告诉我我的方法有什么问题吗 private static int[,] board = new int[3, 3]; //Definition private const int BUFSIZE = 51

我开发了一个小的C#示例,通过使用OpenTK和winforms来选择要点

有一种方法可以画正方形,还有另一种方法可以拾取三角形。不知何故,我没有得到任何点击。Readpixel方法有什么问题吗?因为我刚刚用正确的方法将Tao picking示例转换为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();
            }
        }
    }
private static int[,]board=new int[3,3]//定义
private const int BUFSIZE=512;
私有void glcontrol1u MouseDown(对象发送方,MouseEventArgs e)
{
int[]selectBuffer=new int[BUFSIZE];//必须重新定义
整数命中率;
int[]视口=新int[4];
if(e.Button==MouseButtons.Left)
{
GL.GetInteger(GetPName.Viewport,Viewport);
总账SelectBuffer(BUFSIZE,SelectBuffer);
GL.RenderMode(RenderingMode.Select);
GL.InitNames();
总帐名称(0);
GL.MatrixMode(MatrixMode.Projection);
GL.PushMatrix();
GL.LoadIdentity();
字节4像素=新字节4();
GL.ReadPixels(e.X,视口[3]-e.Y,1,1,PixelFormat.Rgba,PixelType.UnsignedByte,参考像素);
uint SelectedTriangle=SelectedTriangle=Pixel.ToUInt32();
GL.Ortho(0,3,0,3,1,-1);//左下角像素有坐标(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();
}
}
专用静态空心正方形(整数模式)
{
int i,j;
对于(i=0;i<3;i++)
{
if(mode==GL.RenderMode(RenderingMode.Select))
总帐货物名称(一);
对于(j=0;j<3;j++)
{
if(mode==GL.RenderMode(RenderingMode.Select))
总帐名称(j);
GL.Color3((浮动)i/3.0f,(浮动)j/3.0f,(浮动)板[i,j]/3.0f];
GL.Rect(i,j,(i+1),(j+1));
if(mode==GL.RenderMode(RenderingMode.Select))
GL.PopName();
}
}
}

我在代码中出了一些问题。它提出了这个问题。像这样更改实例。然后它将工作:)。一个小错误导致了一个大问题:-(

//(mode == GL.RenderMode(RenderingMode.Select))
(mode == RenderingMode.Select) // Removed GL.RenderMode