1

私はVB.NET環境内でopenGLを実行する方法を学ぼうとしていましたが、TaoフレームワークまたはOpenTKが推奨されており、OpenTKの方が推奨されているようです。

私はこれにまったく慣れていないので、単純なボックスや三角形などを実際に描いて、より複雑なものを作成する前にすべてを理解できるようにしようとしています。これまでのところうまくいかなかったので、これまでに行ったことを順番にリストします。簡単な形を描くために、ここの誰かが修正したり、新しい例を提供したりできることを願っています。

1)opentk-2010-10-06.exeを使用してOpenTKをインストールしました

2)新しいプロジェクトで、OpenTK.dllとOpenTK.Compatibility.dllへの参照を追加しました

3)コントロール(opentk.glcontrol.dll)を追加しました

4)フォームに実際のコントロールを追加しました。

オンラインでいくつかの例を使用して、残りを追加しました。

5)私は自分の参考文献を次のように書きました:

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

6)私のグローバル変数:

 Dim _STARTED As Boolean = False

7)私は自分のイベントを書きました:

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)最後に、私はそれらを呼び出しようとしました:

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

上記の結果は表示されませんので、ご協力いただければ幸いです。

完全な解決策がわからなくても、どんな応答でもいいでしょう。

4

2 に答える 2

1

レンダリング コードも投稿してください (つまり、Paint イベント ハンドラ)。投稿したコードは、OpenGL ビューポートと投影マトリックスを設定しますが、実際には何もレンダリングしません。

于 2012-02-22T10:38:35.960 に答える
0

私は自分の質問を解決しました:pラッパークラスを作成して、入力に基づいていくつかのプリミティブを描画できるようにしました。これにより、円、多角形、三角形、テキストなど、さまざまなものを描画できるようになります。

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
于 2012-02-24T21:51:39.247 に答える