2012-03-19 17 views
2

我想使用这个GLWidget的事情来开发使用OpenTK和GTK#,这似乎是一件好事,但遗憾的是,它旁边没有任何文档。我试图了解如何在该Widget中渲染任何东西。到目前为止,我创建了monodevelop解决方案,添加了对OpenTK和GLWidget的引用,现在我在Stetic的工具窗格中看到了GLWidget,我添加了一个带有两个插槽的Vbox,在上面一个中添加了一个菜单栏,着名的GLWidget。我还为OnRender事件和初始化事件创建了一个事件处理程序,但我甚至无法绘制三角形。有没有人曾与GLWidget合作过,可以给我一些建议?这里是我的MainWindow.cs代码:如何在Monodevelop中使用OpenTK GLWidget进行渲染?

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改变背景颜色。

+0

你需要设置投影机(相机) - 另外,请浏览www.opentk.com网站上的介绍文档。在渲染的第一部分中有简单的“绘制三角形”样本。 – holtavolt 2012-03-20 02:49:18

+0

感谢您的评论,我看到了这些示例,但它们仅适用于GameWindow,不适用于GLWidget。 – Samssonart 2012-03-20 17:22:10

回答

1

好了,我终于能够得到它的工作,在主窗口的代码看起来应该是这样的:

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

这个页面应该给你缺少的部分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 
} 
+0

感谢您的评论,我已经看过该教程了,但那是GLControl,它只适用于Windows窗体,不适用于GTK#,GLWidget是一个GTK#工具,http://www.opentk.com/project/glwidget – Samssonart 2012-03-20 17:24:18