[OpenGL]Textur verwenden

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    [OpenGL]Textur verwenden

    Hallo Leute,
    ich hab mal ein ganz neues Thema angefangen: 3D Programmieren. Ich habe mich für OpenGL entschieden, da ich die DirectX Klassen nicht auf meinen PC installieren konnte. (Wenn mir Irgendjemand einen Tipp geben kann was der Fehler "S1023" bedeutet, werd' ich das natürlich nachholen ;))

    Ich hab mal mit einem einfachem Beispiel angefangen: Einen Würfel der sich immerzu dreht 8-)
    Sieht auch ganz gut aus, aber ich habe vor eine Textur einzubinden. Funktioniert leider nicht so ganz :rolleyes:

    Hier mal mein Ansatz:
    Quellcode (~120 Zeilen)

    VB.NET-Quellcode

    1. Imports OpenTK
    2. Imports OpenTK.Graphics
    3. Imports OpenTK.Graphics.OpenGL
    4. Public Class Form1
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. Dim sgw As New Action(AddressOf StartGame)
    7. sgw.BeginInvoke(Nothing, Nothing)
    8. End Sub
    9. Sub StartGame()
    10. Dim ge As New GameEngine()
    11. ge.Run()
    12. Me.Invoke(Sub() Me.Close())
    13. End Sub
    14. End Class
    15. Class GameEngine
    16. Inherits GameWindow
    17. Shadows WithEvents keyboard As OpenTK.Input.KeyboardDevice = MyBase.Keyboard
    18. Dim quad_tex As Integer
    19. Public Sub New()
    20. MyBase.New(1, 1, GraphicsMode.Default, "OpenGLTest1")
    21. Me.WindowState = OpenTK.WindowState.Maximized
    22. End Sub
    23. Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    24. MyBase.OnLoad(e)
    25. GL.ClearColor(Color.LightBlue)
    26. GL.Enable(EnableCap.Texture2D)
    27. GL.Enable(EnableCap.DepthTest)
    28. 'Texturen laden
    29. quad_tex = GL.GenTexture()
    30. GL.BindTexture(TextureTarget.Texture2D, quad_tex)
    31. Dim bmp = New Bitmap("tex.png")
    32. Dim bmp_data = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
    33. GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp.Width, bmp.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, bmp_data.Scan0)
    34. bmp.UnlockBits(bmp_data)
    35. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, TextureMinFilter.Linear)
    36. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, TextureMagFilter.Linear)
    37. End Sub
    38. Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
    39. MyBase.OnResize(e)
    40. GL.Viewport(0, 0, Width, Height)
    41. Dim aspect = Width / Height
    42. Dim proMat = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver2, aspect, 0.1, 5)
    43. GL.MatrixMode(MatrixMode.Projection)
    44. GL.LoadMatrix(proMat)
    45. GL.MatrixMode(MatrixMode.Modelview)
    46. GL.LoadIdentity()
    47. End Sub
    48. Private Sub keyboard_KeyDown(ByVal sender As Object, ByVal e As OpenTK.Input.KeyboardKeyEventArgs) Handles keyboard.KeyDown
    49. If e.Key = Input.Key.Escape Then
    50. Me.Close()
    51. End If
    52. End Sub
    53. Dim angle = 0
    54. Protected Overrides Sub OnRenderFrame(ByVal e As OpenTK.FrameEventArgs)
    55. MyBase.OnRenderFrame(e)
    56. GL.Clear(ClearBufferMask.ColorBufferBit Or ClearBufferMask.DepthBufferBit)
    57. GL.LoadIdentity()
    58. GL.Translate(0, 0, -5)
    59. GL.Rotate(angle, Vector3d.UnitY)
    60. GL.Rotate(angle, Vector3d.UnitX)
    61. angle += 0.2
    62. If angle = 360 Then angle = 0
    63. GL.Color3(Color.Black)
    64. GL.BindTexture(TextureTarget.Texture2D, quad_tex)
    65. GL.Begin(BeginMode.Quads)
    66. 'Vorderseite
    67. GL.TexCoord2(0, 0) : GL.Vertex3(-1, -1, 1)
    68. GL.TexCoord2(0, 1) : GL.Vertex3(-1, 1, 1)
    69. GL.TexCoord2(1, 1) : GL.Vertex3(1, 1, 1)
    70. GL.TexCoord2(1, 0) : GL.Vertex3(1, -1, 1)
    71. 'Hinterseite
    72. GL.Vertex3(-1, -1, -1)
    73. GL.Vertex3(-1, 1, -1)
    74. GL.Vertex3(1, 1, -1)
    75. GL.Vertex3(1, -1, -1)
    76. 'Seite links
    77. GL.Vertex3(-1, -1, 1)
    78. GL.Vertex3(-1, 1, 1)
    79. GL.Vertex3(-1, 1, -1)
    80. GL.Vertex3(-1, -1, -1)
    81. 'Seite rechts
    82. GL.Vertex3(1, -1, 1)
    83. GL.Vertex3(1, 1, 1)
    84. GL.Vertex3(1, 1, -1)
    85. GL.Vertex3(1, -1, -1)
    86. 'Seite oben
    87. GL.Vertex3(-1, 1, 1)
    88. GL.Vertex3(-1, 1, -1)
    89. GL.Vertex3(1, 1, -1)
    90. GL.Vertex3(1, 1, 1)
    91. 'Seite unten
    92. GL.Vertex3(-1, -1, 1)
    93. GL.Vertex3(-1, -1, -1)
    94. GL.Vertex3(1, -1, -1)
    95. GL.Vertex3(1, -1, 1)
    96. GL.End()
    97. SwapBuffers()
    98. End Sub
    99. End Class


    Ich habe den Verdacht, dass ich GL.TexCoord2 noch irgendwo einbauen muss, da in meiner Vorlage steht:

    VB.NET-Quellcode

    1. ' Face frontal
    2. GL.TexCoord2(0.0, 1.0) : GL.Vertex3(-1, 1, 1)
    3. GL.TexCoord2(1.0, 1.0) : GL.Vertex3(1, 1, 1)
    4. GL.TexCoord2(1.0, 0.0) : GL.Vertex3(1, -1, 1)
    5. GL.TexCoord2(0.0, 0.0) : GL.Vertex3(-1, -1, 1)
    6. ...


    Allerdings weiß ich erstens nicht was genau diese Funktion macht bzw. wie sie zum einsetzen ist (Google spuckt auch nichts verständliches für mich aus - bin auch erst in der 4.Klasse :S ).
    Zweitens bin ich mir nicht ganz sicher. Hoffe ihr findet was :D

    Ich kanns kaum erwarten meine ersten "3D-Spiele" zu machen :love:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Memo“ ()

    Memo schrieb:

    Wenn mir Irgendjemand einen Tipp geben kann was der Fehler "S1023" bedeutet [...]
    Probier mal vorher DAS HIER zu installieren, hab mehrfach gelesen, dass das den Fehler beheben soll, kanns aber nicht selber bestätigen.

    VB.NET-Quellcode

    1. GL.TexCoord2(0.0, 1.0) : GL.Vertex3(-1, 1, 1)
    2. GL.TexCoord2(1.0, 1.0) : GL.Vertex3(1, 1, 1)
    3. GL.TexCoord2(1.0, 0.0) : GL.Vertex3(1, -1, 1)
    4. GL.TexCoord2(0.0, 0.0) : GL.Vertex3(-1, -1, 1)

    Schiebt die Daten in die Graka bzw. Puffer...
    TexCoord2 setzt eben eine Texturkoordinate, des Vertex, der anschließend(oder davor, gesendet wurde)...

    Quellcode

    1. Schritt Vertex Texcoord
    2. 1. 0,1
    3. 2. -1,1,1 0,1
    4. 3. -1,1,1 0,1
    5. 1,1
    6. 3. -1,1,1 0,1
    7. 1,1,1 1,1

    klar soweit? wird alles nacheinander entsprechend reingeschoben, da wo frei ist...Wie bei zwei Arrays, immer ans hinterste angehängt..
    deshalb wäre es auch egal, wenn du die Texturkoordinaten erst nach den Vertices sendest...

    Ansonsten seh ich da keinen Fehler...was funktioniert denn nicht?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl: Er macht mir einfach keine Textur drauf ;)
    Aber ich glaub ich versteh' jetzt wenigstens, was TexCoord2 macht ;)

    VB.NET-Quellcode

    1. GL.Color3(Color.Black)
    2. GL.BindTexture(TextureTarget.ProxyTexture2D, quad_tex)
    3. GL.Begin(BeginMode.Quads)
    4. 'Vorderseite
    5. GL.TexCoord2(0, 0) : GL.Vertex3(-1, -1, 1)
    6. GL.TexCoord2(0, 1) : GL.Vertex3(-1, 1, 1)
    7. GL.TexCoord2(1, 1) : GL.Vertex3(1, 1, 1)
    8. GL.TexCoord2(1, 0) : GL.Vertex3(1, -1, 1)

    Das Ergebnis ist das selbe - ein schwarzer Würfel :(
    @Memo: ja, ich meinte auch die SDK, und ich hatte nur schon mehrfach gelesen, dass man zuerst o. g. Programm installieren soll und dann den/die/das (?) SDK.

    BTW. Welches Betriebssystem verwendest du eigentlich? Auf XP z.B. ist meines Wissens 9.0c oder so das neueste installierbare
    Ich hab' Windows 7.
    Aber wenn schon soll das ganze auch auf XPs funktionieren ;)
    Danke für den Tipp. :)

    EDIT: Nein, das Zeug hat nichts genutzt. Es sagt nur "Fehler - weitere Informationen finden Sie in "dxerror.log" im Ordner Windows" (oder so ^^)
    Die Datei gibt es leider nicht :(

    Hat sonst noch jemand eine Idee, wie ich die Textur draufkrieg'?
    Ok. Ich habe das Problem jetzt gelöst :D

    Statt

    VB.NET-Quellcode

    1. GL.Color3(Color.Black)
    2. GL.BindTexture(TextureTarget.Texture2D, quad_tex)
    3. GL.Begin(BeginMode.Quads)
    4. ...

    einfach:

    VB.NET-Quellcode

    1. GL.BindTexture(TextureTarget.Texture2D, quad_tex)
    2. GL.Begin(BeginMode.Quads)
    3. ...

    Anscheinend "überschreibt" die Farbe des Objekts die Textur einfach. ^^
    (Mir kommt vor, ich habe das sogar schon mal ausprobiert... :S )
    Hi
    das Thema ist sehr bärtig, bitte zukünftig auf das Erstelldatum achten! Auf alte Themen ist nur zu antworten, wenn eine weitere Frage dazu besteht oder es sich in einem entsprechenden Unterforum befindet. Ob dies gültig ist, ist denn jeweils gültigen Regeln zu entnehmen.

    *Topic closed*

    Gruß
    ~blaze~