c# - 如何在 Monodevelop 中使用 OpenTK GLWidget 进行渲染?

标签 c# opengl opentk

我正在尝试使用这个 GLWidget 东西来使用 OpenTK 和 GTK# 进行开发,这似乎是一件好事,但遗憾的是几乎没有相关文档。我试图了解如何渲染该小部件中的任何内容。到目前为止,我创建了一个 monodevelop 解决方案,添加了对 OpenTK 和 GLWidget 的引用,现在我在 Stetic 的工具 Pane 中看到 GLWidget,我添加了一个 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 更改背景颜色。

最佳答案

好吧,我终于能够让它工作了,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 (已存档)

关于c# - 如何在 Monodevelop 中使用 OpenTK GLWidget 进行渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9778875/

相关文章:

c# - ASP.Net MVC : Submit array/collection in a single parameter

opengl - 使用 VAO 时,VBO 中的交错是否会提高性能

c++ - GLM - 旋转使对象消失

c# - opengl-Vbo 颜色在对象之间混合

c# - vTextCoord 值不起作用 - c# OPENTK

c# - Windows 窗体 700 多页打印问题

c# - 范围解析运算符::与成员访问运算符。在 C#

c# - 使用 AutoGen FFmpeg 库在 MP4 中同步音频/视频

c++ - Qt 如何在幕后共享 OpenGL 上下文?

c# - OpenGL - 单 channel 立方体贴图不产生输出