سؤال

I was trying to learn how to do openGL within a VB .NET environment and it seems that the Tao framework or OpenTK is recommended with OpenTK having a higher recommendation so that is what I chose to try using.

Since I am brand new to this, I am trying to just draw a simple box, triangle, or anything really so that I can understand it all before making more complex things. I have been unsuccessful at this so far so I will list in order what I have done so far and hopefully someone here can help me correct it or provide a new example just so I can draw a simple shape.

1) I installed OpenTK using opentk-2010-10-06.exe

2) In a new project I added the references to OpenTK.dll and OpenTK.Compatibility.dll

3) I added the control (opentk.glcontrol.dll)

4) I added the actual control to my form.

Using some examples online I added the rest:

5) I wrote my references in:

Imports OpenTK
Imports OpenTK.GLControl
Imports OpenTK.Platform
Imports OpenTK.Graphics.OpenGL
Imports System.Math

6) My global variable:

 Dim _STARTED As Boolean = False

7) I wrote my events:

Private Sub GlControl1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles GlControl1.Resize _STARTED = True ResizeGL() End Sub

Private Sub ResizeGL()
    GL.Viewport(0, 0, GlControl1.Width, GlControl1.Height)
    GL.MatrixMode(MatrixMode.Projection) ' Select The Projection Matrix
    GL.MatrixMode(MatrixMode.Modelview) ' Select The Modelview Matrix
    GL.LoadIdentity() ' Reset The Modelview Matrix
End Sub


Public Sub ViewPerspective() ' Set Up A Perspective View

    GL.MatrixMode(MatrixMode.Projection) ' Select Projection
    GL.LoadIdentity() ';    
    Dim perspective1 As Matrix4 = OpenTK.Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, _
                                         CSng((GlControl1.Width) / (GlControl1.Height)), 0.1, 1000)
    GL.LoadMatrix(perspective1)
    GL.MatrixMode(MatrixMode.Modelview) ' Select The Modelview Matrix
    GL.LoadIdentity() ' Reset The Matrix
    GL.Enable(EnableCap.DepthTest) ' This doesnt need to be here but.. If your using the Z buffer.. It dont hurt.

End Sub


Public Sub ViewOrtho()
    GL.MatrixMode(MatrixMode.Projection) 'Select Projection
    GL.LoadIdentity() ' Reset The Matrix
    GL.Ortho(0, GlControl1.Width, -GlControl1.Height, 0, 0.1, 100.0) ' Select Ortho Mode
    GL.MatrixMode(MatrixMode.Modelview) ' Select Modelview Matrix
    GL.LoadIdentity() ' Reset The Matrix
End Sub

8) Lastly, I tried to call them:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ViewOrtho()
End Sub

The above results in no display, so any help would be greatly appreciated.

Even if you don't know a full solution, any response wouldbe nice.

هل كانت مفيدة؟

المحلول 2

I have solved my own question :p I have created a wrapper class so that I can draw some primatives based on inputs which should allow me to draw many things: a circle, polygon, triangle, and text.

Private Sub GlControl1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GlControl1.Load
    GL.ClearColor(Color.Black)
    SetupViewport()
End Sub

Public Sub SetupViewport()
    Dim w As Integer = GlControl1.Width
    Dim h As Integer = GlControl1.Height
    GL.MatrixMode(MatrixMode.Projection)
    GL.LoadIdentity()
    GL.Ortho(0, w, 0, h, -1, 1)
    GL.Viewport(0, 0, w, h)
End Sub


Private Sub GlControl1_Resize(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GlControl1.Resize
    SetupViewport()
    GlControl1.Invalidate()
End Sub


Private Sub GlControl1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles GlControl1.Paint
    GL.Clear(ClearBufferMask.ColorBufferBit)
    GL.Clear(ClearBufferMask.DepthBufferBit)

    'go through list and draw shapes
    Dim i As Integer = 0
    Try
        Do Until i = objectsettings.GetUpperBound(1) + 1
            Select Case objectsettings(1, i)
                Case "circle"
                    draw_circle(objectsettings(2, i), objectsettings(3, i), objectsettings(5, i), objectsettings(12, i))
                Case "polygon"
                    draw_polygon(objectsettings(2, i), objectsettings(3, i), objectsettings(6, i), objectsettings(7, i), objectsettings(4, i), objectsettings(12, i))
                Case "text"
                    draw_text(objectsettings(2, i), objectsettings(3, i), objectsettings(6, i), objectsettings(7, i), objectsettings(4, i), objectsettings(8, i), objectsettings(12, i))
                Case "triangle"
                    draw_triangle(objectsettings(2, i), objectsettings(3, i), objectsettings(4, i), objectsettings(9, i), objectsettings(10, i), objectsettings(11, i), objectsettings(12, i))
                Case Else
                    Exit Do
            End Select


            i = i + 1
        Loop
    Catch
    End Try



    GlControl1.SwapBuffers()

End Sub

نصائح أخرى

Please post your rendering code, too (i.e. you Paint event handler). The code you posted sets up the OpenGL viewport and projection matrix, but doesn't actually render anything.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top