2016-12-07 6 views
0

How to draw line in OpenGl?의 코드를 살펴 보았지만 glBegin 및 glEnd는 deprecated로 표시되었습니다. 현재 OpenGL 버전에서 어떻게 선을 그리기로되어 있습니까? VBOX를 사용하는 기사와 glVertexPointerglColorPointer에 대한 기사는 입니다. 셰이더 프로그램 컴파일 및 연결과 정점 특성 비트가 복잡 해지는 방식으로 이러한 메서드를 구축하는 프레임 워크가 있습니다. 더 이상 사용되지 않는 함수를 사용하지 않고 선을 그리는 간단한 방법이 없습니까? 그래서, 심지어 DrawArrays를 사용하여 바로 야구장에있는 경우 또는 해요 만약 내가 그 방법은 그것과 함께 갈 프레임 워크의 전체 엉망이 필요 모르는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); 

:

나는 성공없이 시도 나는 필요하지 않다. 이코드 작업을하고 싶다. 난 그냥 현대 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(); 
     } 
    } 
}