Как сделать рендеринг с помощью OpenTK GLWidget в Monodevelop? - PullRequest
2 голосов
/ 20 марта 2012

Я пытаюсь использовать эту штуку GLWidget для разработки с использованием OpenTK и GTK #, это кажется хорошей вещью, но, к сожалению, документации для нее почти нет.Я пытаюсь понять, как сделать что-нибудь в этом виджете.До сих пор я создал решение monodevelop, добавил ссылки на OpenTK и GLWidget, теперь я вижу GLWidget на панели инструментов Stetic, я добавил Vbox с двумя слотами, в верхнем я добавил строку меню, а в нижнем -знаменитый GLWidget.Я также создал обработчик событий для события OnRender и события Initialized, но я даже не могу нарисовать треугольник.Кто-нибудь работал с GLWidget и может дать мне какой-нибудь совет?Вот мой код MainWindow.cs:

   using System;
   using Gtk;
   using OpenTK;
   using OpenTK.Graphics;
   using OpenTK.Graphics.OpenGL;
   using OpenTK.Audio;
   using OpenTK.Audio.OpenAL;
   using OpenTK.Input;

   public partial class MainWindow : Gtk.Window{

    public MainWindow () : base(Gtk.WindowType.Toplevel)
    {
    Build ();
     }

   protected void GLWidgetInitialize (object sender, System.EventArgs e)
   {
    int width = 0, height = 0;
    //glwidget7.GdkWindow.GetSize(out width, out height);   
    this.vbox3.GetSizeRequest(out width, out height);
    GL.Viewport(0, 0, width, height);
    GL.ClearColor(1.0f, 1.0f,1.0f,1.0f);
    GL.Clear(ClearBufferMask.ColorBufferBit);
}

protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
    Application.Quit ();
    a.RetVal = true;
}


protected void OnRenderFrameWidget (object sender, System.EventArgs e)
{

    GL.ClearColor(1.0f, 1.0f,1.0f,1.0f);
    GL.Begin(BeginMode.Triangles);

        GL.Color3(1.0f, 1.0f, 0.0f); GL.Vertex3(-1.0f, -1.0f, 4.0f);
        GL.Color3(1.0f, 0.0f, 0.0f); GL.Vertex3(1.0f, -1.0f, 4.0f);
        GL.Color3(0.2f, 0.9f, 1.0f); GL.Vertex3(0.0f, 1.0f, 4.0f);

    GL.End();
}

}

Кстати, изменение значений GLClearColor заставляет мой GLWidget изменять цвет фона.

Ответы [ 2 ]

1 голос
/ 12 апреля 2012

Ну, наконец-то я смог заставить его работать, код MainWindow должен выглядеть примерно так:

  public partial class MainWindow : Gtk.Window
  {

public bool GLinit;

public MainWindow () : base(Gtk.WindowType.Toplevel)
{
    Build ();
    GLinit = false;
}

protected virtual void GLWidgetInitialize (object sender, System.EventArgs e)
{
    //this might be overkill to some people, but worked for me

    int width = 0, height = 0;  
    this.vbox3.GetSizeRequest(out width, out height);
    float aspectRatio = width/ height; 
    GL.Viewport(0, 0, width, height);
    GL.ClearColor(1.0f, 1.0f,1.0f,1.0f);
    GL.Clear(ClearBufferMask.ColorBufferBit);
    GL.MatrixMode(MatrixMode.Modelview);
    GL.LoadIdentity();
    GL.ShadeModel(ShadingModel.Smooth);         
    Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, aspectRatio, 1.0f, 64.0f);
    GL.MatrixMode(MatrixMode.Projection);           
    GL.LoadMatrix(ref projection);          
    GL.ClearDepth(1);              
    GL.Disable(EnableCap.DepthTest);    
    GL.Enable(EnableCap.Texture2D); 
    GL.Enable(EnableCap.Blend);
    GL.DepthFunc(DepthFunction.Always);     
    GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest); 
    //add idle event handler to process rendering whenever and as long as time is availble.
    GLinit = true;
    GLib.Idle.Add(new GLib.IdleHandler(OnIdleProcessMain));

}

protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
    Application.Quit ();
    a.RetVal = true;
}


protected void RenderFrame(){

    //Here's where you write your OpenGL code to draw whatever you want
            //Don't forget to swap your buffers

        OpenTK.Graphics.GraphicsContext.CurrentContext.SwapBuffers();

}

protected bool OnIdleProcessMain ()
{
    if (!GLinit) return false;
    else{
             RenderFrame();
         return true;
    }
}   
 }

Подробнее см. Здесь: http://www.opentk.com/node/2910

0 голосов
/ 20 марта 2012

Эта страница должна дать вам недостающий фрагмент http://www.opentk.com/doc/chapter/2/glcontrol - см. Метод SetupViewport (ниже) - выполните аналогичную операцию GL.Ortho для настройки матрицы проекции (также называемой «камерой») в вашей настройке.

private void SetupViewport()
{
  int w = glControl1.Width;
  int h = glControl1.Height;
  GL.MatrixMode(MatrixMode.Projection);
  GL.LoadIdentity();
  GL.Ortho(0, w, 0, h, -1, 1); // Bottom-left corner pixel has coordinate (0, 0)
  GL.Viewport(0, 0, w, h); // Use all of the glControl painting area
}
...