OpenTK würfel mit textur

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von 00yoshi.

    OpenTK würfel mit textur

    Wie kann man mit VB2010 einen 3D-würfel mit texture erstellen? bisher schaffe ich nur einen mit shading (rot-grün-blau)
    Ich hab das gefunden:

    VB.NET-Quellcode

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

    Aber ich verstehe nicht, wie man dann eine Texture aus einer Bitmap machen kann. Wie kann man z.B. eine Textur als Integer einfügen?
    Du konvertierst deine Bitmap nicht in einen Integer. Das ist eine falsche Vorstellung. Du lädst sie in einer für OpenGL verwertbaren Form zB RGBA und lädst sie dann mit via GL auf die GraKa. Dort wird das Bild dann in irgendeine Tabelle/Speicher gepackt und du kriegst ne Nummer. Diese Nummer symbolisiert dann dein Bild und das gibst du den anderen Funktionen.
    Um einen 3D-Würfel zu erzeugen musst du einfach nur alle 6 Seiten abdecken. Solltest du mit Vektoren in Mathe schon mal Kontakt haben sollte das einfacher fallen; andernfalls einlesen. Dann sollten die Transformationsmatrizen auch einfacher sein.
    Übrigends arbeitest du nach einer relativ veralteten Spezifikation von OpenGL <=GL1.5. Einfach zu schreiben, aber im Endeffekt nicht so effizient, wie nach einer neueren Spezifikation wie GL4.
    Da ist ja auch gl.begin(beginmode.quads) unterstrichen, aber was soll "Use PrimitiveType instead" heißen?

    VB.NET-Quellcode

    1. Dim bmp as bitmap = bitmap.fromfile(DIEDATEI)
    2. Dim bmp_data As Imaging.BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    3. GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp_data.Width, bmp_data.Height, 0,
    4. OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bmp_data.Scan0)
    5. bmp.UnlockBits(bmp_data)
    6. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, TextureMinFilter.Linear)
    7. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, TextureMagFilter.Linear)

    Das habe ich jetzt, aber wie mache ich es dann auf eine fläche:

    VB.NET-Quellcode

    1. GL.Vertex3(25, -25, 0)
    2. GL.Vertex3(-25, -25, 0)
    3. GL.Vertex3(-25, 25, 0)
    4. GL.Vertex3(25, 25, 0)
    5. GL.TexCoord2(0, 0)
    6. GL.TexCoord2(0, 1)
    7. GL.TexCoord2(1, 0)
    8. GL.TexCoord2(1, 1)
    9. GL.End()

    So funktioniert es nicht.

    ERLEDIGT!!! :D :D :D

    VB.NET-Quellcode

    1. GL.Begin(BeginMode.Quads)
    2. GL.BindTexture(TextureTarget.Texture2D, id)
    3. GL.TexCoord2(1, 0) : GL.Vertex3(25, -25, 0)
    4. GL.TexCoord2(0, 0) : GL.Vertex3(-25, -25, 0)
    5. GL.TexCoord2(0, 1) : GL.Vertex3(-25, 25, 0)
    6. GL.TexCoord2(1, 1) : GL.Vertex3(25, 25, 0)
    7. GL.End()

    Und

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. id = GL.GenTexture()
    3. GL.BindTexture(TextureTarget.Texture2D, id)
    4. Dim bmp_data As Imaging.BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    5. GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp_data.Width, bmp_data.Height, 0,
    6. OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bmp_data.Scan0)
    7. bmp.UnlockBits(bmp_data)
    8. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, TextureMinFilter.Linear)
    9. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, TextureMagFilter.Linear)
    10. GL.Enable(EnableCap.Texture2D)
    11. PictureBox1.Image = bmp
    12. Me.Invalidate()
    13. End Sub

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „00yoshi“ ()

    Fang vielleicht erstmal mit 2D an ;) ich glaube das vereinfacht vieles
    2D kann ich ja schon, nur noch eine frage:

    VB.NET-Quellcode

    1. GL.BindTexture(TextureTarget.Texture2D, id(0))
    2. GL.TexCoord2(1, 0) : GL.Vertex3(25, -25, -25)
    3. GL.TexCoord2(0, 0) : GL.Vertex3(-25, -25, -25)
    4. GL.TexCoord2(0, 1) : GL.Vertex3(-25, 25, -25)
    5. GL.TexCoord2(1, 1) : GL.Vertex3(25, 25, -25)
    6. GL.BindTexture(TextureTarget.Texture2D, id(1))
    7. GL.TexCoord2(1, 0) : GL.Vertex3(25, -25, 25)
    8. GL.TexCoord2(0, 0) : GL.Vertex3(-25, -25, 25)
    9. GL.TexCoord2(0, 1) : GL.Vertex3(-25, 25, 25)
    10. GL.TexCoord2(1, 1) : GL.Vertex3(25, 25, 25)

    macht eine exception, muss man die Textur "entbinden"?
    Wenn ja, wie? gl.unbind... gibt es ja nicht...

    EDIT:
    Hatte was vergessen... hatte ausversehen die zahl vergessen. Dim id(5) as integer

    00yoshi schrieb:

    2D kann ich ja schon

    Wenn du PictureBoxen, extremes laggen und komplett schlechte 2D-Umsetzung als Können bezeichnest, dann ja.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ja, bezeichne ich als ja. (Was laggt denn an einem Timer, einer 9*9 array und einer picturebox (oh... warte... 8*64 = 512*2 = 262144, könnte daran liegen... bei mir laggt es nicht.).)
    Aber der fehler müsste irgendwo hier liegen(hab schon mit arrays probiert):

    VB.NET-Quellcode

    1. Dim id(5) As Integer
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. Dim bmp(5) As Bitmap
    4. Dim bmp_data(5) As Imaging.BitmapData
    5. For I As Integer = 1 To 6
    6. bmp(I - 1) = Bitmap.FromFile("C:\users\coskun\desktop" & I & ".png")
    7. id(I - 1) = GL.GenTexture()
    8. GL.BindTexture(TextureTarget.Texture2D, id(I - 1))
    9. bmp_data(I - 1) = bmp(I - 1).LockBits(New Rectangle(0, 0, bmp(I - 1).Width, bmp(I - 1).Height), Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
    10. GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp_data(I - 1).Width, bmp_data(I - 1).Height, 0,
    11. OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bmp_data(I - 1).Scan0)
    12. bmp(I - 1).UnlockBits(bmp_data(I - 1))
    13. Next
    14. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, TextureMinFilter.Linear)
    15. GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, TextureMagFilter.Linear)
    16. GL.Enable(EnableCap.Texture2D)
    17. GlControl1.Invalidate()
    18. End Sub

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

    Dann würde ich nicht sagen dass du 2D mit OGL "beherrschst". Hinweis: Indexierung in VB Arrays fangen bei 1 an (oder lieg ich da falsch?). Zusätzlich ist 1 to 6 eine Schleife von 1 bis 6 ... und es gibt nur 5 Einträge in den Arrays.