2016-12-07 29 views
0

我查看了How to draw line in OpenGl?中的代碼,但將glBegin和glEnd標記爲已棄用。你應該如何在當前的OpenGL版本中繪製一條線?我找到了討論使用VBO的文章,以及討論關於glVertexPointerglColorPointer的文章,但是很多圍繞構建這些方法的框架着色器程序編譯和鏈接以及頂點屬性位旋轉。沒有一種簡單的方法來繪製一條線,而不使用棄用函數?如何在不使用glBegin的情況下在OpenGL中繪製線

我想這沒有成功:

OpenTK.Vector2[] linepts = { new Vector2(0, 0), new Vector2(1, 1), new Vector2(50, 0), new Vector2(0, 50) }; 
int h = GL.GenBuffer(); 
GL.BindBuffer(BufferTarget.ArrayBuffer, h); 
GL.BufferData<Vector2>(BufferTarget.ArrayBuffer, 16, linepts, BufferUsageHint.StreamDraw); 
GL.DrawArrays(PrimitiveType.LineStrip, 0, 4); 
GL.BindBuffer(BufferTarget.ArrayBuffer, 0); 
GL.DeleteBuffer(h); 

我不知道我是不是即使在使用DrawArrays大致正確,或者如果該方法需要架構一個整體混亂與它一起去,所以我不需要想做這個的代碼工作。我只是想找到最簡單的代碼來繪製一條適合在現代OpenGL中使用的線條。

+3

不,沒有簡單的方法。編譯並鏈接一個着色器程序,創建一個VAO,VBO,設置它們,然後調用'DrawArrays()'。 –

+0

爲什麼不查看opengl的官方網頁? –

+0

不,這絕對不是正確的做法。您已經提供了OpenGL頂點數據,但是您沒有將該數據掛鉤到頂點屬性。至少你還需要一個'GL.VertexPointer'調用。如果你想避免固定功能的流水線,並純粹使用着色器,那麼你需要建立屬性位置。這是您在GL 3.0中的工作,現在還沒有預定義的位置。 –

回答

1

這是最簡單的程序(使用OpenTK),我可以創建一條線。

using System; 
using OpenTK; 
using OpenTK.Graphics; 
using OpenTK.Graphics.OpenGL; 

namespace OpenGLLine 
{ 
    static class Program 
    { 
     static OpenTK.GameWindow gw; 
     static int shaderProgram; 
     static int vertexInfo; 
     static int lineVertexBuffer; 
     static int vertexCount; 

     [STAThread] 
     static void Main() 
     { 
     gw = new OpenTK.GameWindow(800, 600, OpenTK.Graphics.GraphicsMode.Default, "Game", OpenTK.GameWindowFlags.FixedWindow); 
     Initialize(); 
     gw.RenderFrame += Gw_RenderFrame; 
     gw.Closed += Gw_Closed; 
     gw.Run(60); 
     } 

     private static void Gw_Closed(object sender, EventArgs e) 
     { 
     CleanUp(); 
     } 

     private static void Initialize() 
     { 
     int vshader = GL.CreateShader(ShaderType.VertexShader); 
     GL.ShaderSource(vshader, @"#version 130 
      in vec2 vPosition; 
      void main() 
      { 
       gl_Position = vec4(vPosition, -1.0, 1.0); 
      }"); 
     GL.CompileShader(vshader); 
     int fshader = GL.CreateShader(ShaderType.FragmentShader); 
     GL.ShaderSource(fshader, @"#version 130 
      out vec4 fragColor; 
      void main() 
      { 
       fragColor = vec4(1.0, 1.0, 1.0, 1.0); 
      }"); 
     GL.CompileShader(fshader); 
     shaderProgram = GL.CreateProgram(); 
     GL.AttachShader(shaderProgram, vshader); 
     GL.AttachShader(shaderProgram, fshader); 
     GL.LinkProgram(shaderProgram); 
     GL.DetachShader(shaderProgram, vshader); 
     GL.DetachShader(shaderProgram, fshader); 
     GL.UseProgram(shaderProgram); 
     lineVertexBuffer = GL.GenBuffer(); 
     Vector2[] lineVertices = { new Vector2(0, 0), new Vector2(.5f, .5f) }; 
     vertexCount = lineVertices.Length; 
     GL.BindBuffer(BufferTarget.ArrayBuffer, lineVertexBuffer); 
     GL.BufferData(BufferTarget.ArrayBuffer, System.Runtime.InteropServices.Marshal.SizeOf(lineVertices[0]) * vertexCount, 
      lineVertices, BufferUsageHint.StreamDraw); 
     vertexInfo = GL.GenVertexArray(); 
     GL.BindVertexArray(vertexInfo); 
     int locVPosition = GL.GetAttribLocation(shaderProgram, "vPosition"); 
     GL.EnableVertexAttribArray(locVPosition); 
     GL.VertexAttribPointer(locVPosition, 2, VertexAttribPointerType.Float, false, 
      System.Runtime.InteropServices.Marshal.SizeOf(lineVertices[0]), 0); 
     GL.BindVertexArray(0); 
     GL.BindBuffer(BufferTarget.ArrayBuffer, 0); 
     GL.UseProgram(0); 
     } 

     static void CleanUp() 
     { 

     GL.DeleteProgram(shaderProgram); 
     GL.DeleteVertexArray(vertexInfo); 
     GL.DeleteBuffer(lineVertexBuffer); 
     } 

     private static void Gw_RenderFrame(object sender, OpenTK.FrameEventArgs e) 
     { 
     GL.ClearColor(Color4.Black); 
     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 
     GL.BindBuffer(BufferTarget.ArrayBuffer, lineVertexBuffer); 
     GL.UseProgram(shaderProgram); 
     GL.BindVertexArray(vertexInfo); 
     GL.DrawArrays(PrimitiveType.LineStrip, 0, vertexCount); 
     GL.BindVertexArray(0); 
     GL.BindBuffer(BufferTarget.ArrayBuffer, 0); 
     GL.UseProgram(0); 
     gw.SwapBuffers(); 
     } 
    } 
} 
相關問題