2017-08-03 4 views
0

私はC#Windowsフォームアプリケーションを作成しています。私はOpenGL.Net、OpenGL.Net Win Forms v0.5.2をNuGetパッケージから使用しています。私は自分のフォームにglControlを追加しました。私はちょうど私が興味深い何かに入る前に、それを正しくセットアップしようとしています。ここでGl.Ortho()が例外を投げているのはなぜですか?どうすれば修正できますか?

は私のloadイベントはここでglControl

private void glControl1_Load(object sender, EventArgs e) 
    { 
     //Initialize Here 
     Gl.ClearColor(0.0f, 0.0f, 1.0f, 1.0f); 
    } 

のためである私の私はGl.Orthoを()の呼び出しから例外を取得していますglControl

private void glControl1_Render(object sender, GlControlEventArgs e) 
    { 
     //Clear first 
     Gl.Clear(ClearBufferMask.ColorBufferBit); 

     Gl.MatrixMode(MatrixMode.Projection); 
     Gl.PushMatrix(); 
     Gl.LoadIdentity(); 
     Gl.Ortho(0, glControl1.Width, 0, glControl1.Height, -1, 1); 

     Gl.MatrixMode(MatrixMode.Modelview); 
     Gl.PushMatrix(); 
     Gl.LoadIdentity(); 

     Gl.Enable(EnableCap.Texture2d); 
     Gl.Enable(EnableCap.Blend); 
     Gl.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); 

     //Draw Here 


     Gl.Disable(EnableCap.Blend); 
     Gl.Disable(EnableCap.Texture2d); 
     Gl.BindTexture(TextureTarget.Texture2d, 0); 

     Gl.PopMatrix(); 
     Gl.MatrixMode(MatrixMode.Projection); 
     Gl.PopMatrix(); 

     Gl.Finish(); 
    } 

のためのイベントをレンダリングしています。私がコメントアウトすると、私はランタイムの問題に遭遇しません。

System.NullReferenceException occurred 
HResult=0x80004003 
Message=Object reference not set to an instance of an object. 
Source=OpenGL.Net 
StackTrace: 
at OpenGL.Gl.Ortho(Single l, Single r, Single b, Single t, Single n, Single f) 
at AnimationTool.Form1.glControl1_Render(Object sender, GlControlEventArgs e) 
Project\AnimationTool\AnimationTool\Form1.cs:line 53 
at OpenGL.GlControl.OnRender() 
at OpenGL.GlControl.OnPaint(PaintEventArgs e) 

は私がOpenGLの呼び出しを行うことができ、唯一の私のGl.Ortho()が例外をスローする方法を理解していません。何が起こっている?

+1

GlControl1がGl.Ortho()に渡される前に設定されていることを確認してください。 – Ripi2

+0

@ Ripi2:例外がプロパティアクセス 'glControl1.Width'(または' Height')からのものだった場合、 'gl.Ortho'は呼び出しスタック上にありません。 –

+0

@Michael:OpenGLコンテキストが初期化される前に 'GLControl'が' Paint'と 'Render'コールバックを引き起こすことがあります。初期化の前にOpenGL呼び出しを使用しようとすると、悲惨に失敗します。 'Load'イベントでbooleanフラグ(良い名前は' isGLReady'となる)を設定してください。 'Paint'や' Render'では、フラグがセットされていなければただちに戻ります。 –

答えて

0

への実際の呼び出しは、Gl.Orthoを指し、glOrthofを指します。これはOpenGL 1.0 ESコマンドです。あなたはデスクトップのGLコンテキストを持っているので、機能はロードされません。したがって、NullReferenceException

Gl.Ortho(0.0, (double)glControl1.Width, 0.0, (double)glControl1.Height, -1.0, 1.0); 

この問題は既にプロジェクトwikiで説明されています。

はちょうど正しいメソッドオーバーロードを使用して、あなたの問題を解決するには。

関連する問題