2014-12-28 156 views
1

即時得到的訪問衝突當過我運行此代碼:系統訪問衝突

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Drawing; 
using OpenTK; 
using OpenTK.Graphics; 
using OpenTK.Graphics.OpenGL; 
using OpenTK.Input; 
using System.IO; 

namespace OpenTKTutorial1 
{ 
    class Game : GameWindow 
    { 
     int pgmID; 
     int vsID; 
     int fsID; 

     int attribute_vcol; 
     int attribute_vpos; 
     int uniform_mview; 

     int vbo_position; 
     int vbo_color; 
     int vbo_mview; 

     Vector3[] vertdata; 
     Vector3[] coldata; 
     Matrix4[] mviewdata; 

     void initProgram() 
     { 
      pgmID = GL.CreateProgram(); 

      loadShader("vs.glsl", ShaderType.VertexShader, pgmID, out vsID); 
      loadShader("fs.glsl", ShaderType.FragmentShader, pgmID, out fsID); 

      GL.LinkProgram(pgmID); 
      Console.WriteLine(GL.GetProgramInfoLog(pgmID)); 

      attribute_vpos = GL.GetAttribLocation(pgmID, "vPosition"); 
      attribute_vcol = GL.GetAttribLocation(pgmID, "vColor"); 
      uniform_mview = GL.GetUniformLocation(pgmID, "modelview"); 

      if (attribute_vpos == -1 || attribute_vcol == -1 || uniform_mview == -1) 
      { 
       Console.WriteLine("Error binding attirbutes"); 
      } 

      GL.GenBuffers(1, out vbo_position); 
      GL.GenBuffers(1, out vbo_color); 
      GL.GenBuffers(1, out vbo_mview); 
     } 

     void loadShader(String filename, ShaderType type, int program, out int address) 
     { 
      address = GL.CreateShader(type); 
      using (StreamReader sr = new StreamReader(filename)) 
      { 
       GL.ShaderSource(address, sr.ReadToEnd()); 
      } 
      GL.CompileShader(address); 
      GL.AttachShader(program, address); 
      Console.WriteLine(GL.GetShaderInfoLog(address)); 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 

      initProgram(); 

      vertdata = new Vector3[]{ 
       new Vector3(-0.8f, -0.8f, 0f), 
       new Vector3(0.8f, -0.8f, 0f), 
       new Vector3(0f, 0.8f, 0f)}; 

      coldata = new Vector3[]{ 
       new Vector3(1f, 0f, 0f), 
       new Vector3(0f, 0f, 1f), 
       new Vector3(0f, 1f, 0f)}; 


      mviewdata = new Matrix4[]{ 
       Matrix4.Identity}; 

      Title = "Title"; 
      GL.ClearColor(Color.CornflowerBlue); 
      GL.PointSize(5f); 
     } 

     protected override void OnRenderFrame(FrameEventArgs e) 
     { 
      base.OnRenderFrame(e); 

      GL.Viewport(0, 0, Width, Height); 
      GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
      GL.Enable(EnableCap.DepthTest); 

      GL.EnableVertexAttribArray(attribute_vpos); 
      GL.EnableVertexAttribArray(attribute_vcol); 

      GL.DrawArrays(PrimitiveType.Triangles, 0, 3); 

      GL.DisableVertexAttribArray(attribute_vpos); 
      GL.DisableVertexAttribArray(attribute_vcol); 

      GL.Flush(); 

      //Everything before this 
      SwapBuffers(); 
     } 

     protected override void OnUpdateFrame(FrameEventArgs e) 
     { 
      base.OnUpdateFrame(e); 

      GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_position); 
      GL.BufferData<Vector3>(BufferTarget.ArrayBuffer, (IntPtr)(vertdata.Length * Vector3.SizeInBytes), vertdata, BufferUsageHint.StaticDraw); 
      GL.VertexAttribPointer(attribute_vpos, 3, VertexAttribPointerType.Float, false, 0, 0); 

      GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_color); 
      GL.BufferData<Vector3>(BufferTarget.ArrayBuffer, (IntPtr)(coldata.Length * Vector3.SizeInBytes), coldata, BufferUsageHint.StaticDraw); 
      GL.VertexAttribPointer(attribute_vcol, 3, VertexAttribPointerType.Float, true, 0, 0); 

      GL.UniformMatrix4(uniform_mview, false, ref mviewdata[0]); 

      GL.UseProgram(pgmID); 

      GL.BindBuffer(BufferTarget.ArrayBuffer, 0); 
     } 
    } 
} 

這使得它在渲染背景,然後崩潰。

我對OpenTK和OpenGL相當陌生,所以我不是100%確定問題所在。

誤差以

GL.DrawArrays(PrimitiveType.Triangles, 0, 3); 
+0

我對這裏的語言/工具箱不熟悉,但是您定義和使用'vertdata'和'coldata'的方式看起來很可疑。至少在其他語言中,它們將是指針/引用的數組。你傳遞給'glBufferData()'的數據需要是一個平坦的緩衝區/浮點值數組。除非神奇地平整陣列,否則這可能不是這裏傳遞的。 –

+0

問題可能來自調用OnUpdateFrame方法中的緩衝區綁定。無法保證此更新在RenderFrame之前被調用,因爲RenderFrame會盡可能經常調用,並且UpdateFrame會以固定速率調用。閱讀[this](http://stackoverflow.com/questions/23542591/open-tk-difference-onrenderframe-and-onupdateframe)瞭解更多詳情。 – BDL

+0

此外,從性能的角度來看,將數據上傳到GPU中並不是一個好主意。 – BDL

回答

2

拋出有你的代碼的一些小問題,但它爲我工作沒有變化。無論如何,我已經做了一些修改並添加了評論來解釋爲什麼,也許有些東西會爲您修復它。如果沒有,請發佈着色器和更多的細節,如果有的話。

using System; 
using System.Drawing; 
using System.IO; 
using OpenTK; 
using OpenTK.Graphics.OpenGL; 

namespace OpenTKTutorial1 
{ 
    public class Game 
     : GameWindow 
    { 
     int pgmID; 
     int vsID; 
     int fsID; 

     int attribute_vcol; 
     int attribute_vpos; 
     int uniform_mview; 

     int vbo_position; 
     int vbo_color; 
     int vbo_mview; 

     Vector3[] vertdata; 
     Vector3[] coldata; 
     Matrix4[] mviewdata; 

     public Game() 
     { 
      // better use the events instead of overriding the inherited methods 
      // at least thats what the documentation on Update- and RenderFrame says 
      Load += OnLoad; 
      UpdateFrame += OnUpdateFrame; 
      RenderFrame += OnRenderFrame; 
     } 

     void InitProgram() 
     { 
      pgmID = GL.CreateProgram(); 

      LoadShader("vs.glsl", ShaderType.VertexShader, pgmID, out vsID); 
      LoadShader("fs.glsl", ShaderType.FragmentShader, pgmID, out fsID); 

      GL.LinkProgram(pgmID); 
      Console.WriteLine(GL.GetProgramInfoLog(pgmID)); 

      attribute_vpos = GL.GetAttribLocation(pgmID, "vPosition"); 
      attribute_vcol = GL.GetAttribLocation(pgmID, "vColor"); 
      uniform_mview = GL.GetUniformLocation(pgmID, "modelview"); 

      if (attribute_vpos == -1 || attribute_vcol == -1 || uniform_mview == -1) 
      { 
       Console.WriteLine("Error binding attributes"); 
      } 

      GL.GenBuffers(1, out vbo_position); 
      GL.GenBuffers(1, out vbo_color); 

      // what is this buffer for? 
      //GL.GenBuffers(1, out vbo_mview); 
     } 

     void LoadShader(String filename, ShaderType type, int program, out int address) 
     { 
      address = GL.CreateShader(type); 
      using (StreamReader sr = new StreamReader(filename)) 
      { 
       GL.ShaderSource(address, sr.ReadToEnd()); 
      } 
      GL.CompileShader(address); 
      GL.AttachShader(program, address); 
      Console.WriteLine(GL.GetShaderInfoLog(address)); 
     } 

     protected void OnLoad(object sender, EventArgs eventArgs) 
     { 
      InitProgram(); 

      vertdata = new Vector3[]{ 
       new Vector3(-0.8f, -0.8f, 0f), 
       new Vector3(0.8f, -0.8f, 0f), 
       new Vector3(0f, 0.8f, 0f)}; 

      coldata = new Vector3[]{ 
       new Vector3(1f, 0f, 0f), 
       new Vector3(0f, 0f, 1f), 
       new Vector3(0f, 1f, 0f)}; 


      mviewdata = new Matrix4[]{ 
       Matrix4.Identity}; 

      Title = "Title"; 
      GL.ClearColor(Color.CornflowerBlue); 
      GL.PointSize(5f); 
     } 

     protected void OnRenderFrame(object sender, FrameEventArgs frameEventArgs) 
     { 
      // if you only have one viewport you can safely move this to the OnResize event 
      GL.Viewport(0, 0, Width, Height); 

      // if the state never changes move it to OnLoad 
      GL.Enable(EnableCap.DepthTest); 

      GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

      GL.EnableVertexAttribArray(attribute_vpos); 
      GL.EnableVertexAttribArray(attribute_vcol); 

      // always make sure the program is enabled .. 
      GL.UseProgram(pgmID); 
      // .. before you set any uniforms 
      GL.UniformMatrix4(uniform_mview, false, ref mviewdata[0]); 
      // .. or draw anything 
      GL.DrawArrays(PrimitiveType.Triangles, 0, 3); 

      GL.DisableVertexAttribArray(attribute_vpos); 
      GL.DisableVertexAttribArray(attribute_vcol); 

      // do not call glFlush unless you have a very good reason to 
      // it can result in significant slow downs 
      //GL.Flush(); 

      SwapBuffers(); 
     } 

     protected void OnUpdateFrame(object sender, FrameEventArgs frameEventArgs) 
     { 
      // your vertex and color data never changes, thus everything you do here 
      // could be moved to OnLoad instead of having it repeated all the time 
      GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_position); 
      GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertdata.Length * Vector3.SizeInBytes), vertdata, BufferUsageHint.StaticDraw); 
      GL.VertexAttribPointer(attribute_vpos, 3, VertexAttribPointerType.Float, false, 0, 0); 

      GL.BindBuffer(BufferTarget.ArrayBuffer, vbo_color); 
      GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(coldata.Length * Vector3.SizeInBytes), coldata, BufferUsageHint.StaticDraw); 
      GL.VertexAttribPointer(attribute_vcol, 3, VertexAttribPointerType.Float, true, 0, 0); 

      GL.BindBuffer(BufferTarget.ArrayBuffer, 0); 
     } 
    } 
} 
+0

將所有內容從「OnUpdateFrame」移動到「OnLoad」修復崩潰。非常感謝您(您可能希望將其作爲未來讀者的答案) – LAK132