[OpenGL Vertex Buffer ] Werte wie verändern oder anpassen ?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Pascalony.

    [OpenGL Vertex Buffer ] Werte wie verändern oder anpassen ?

    Hi.Ich nutze VisualBasic 2013 mit OpenTK + Tao.OpenGl

    Ich baue eine kleine 3D (Stadt Platform) es Funktioniert fast alles ADD,Lösch,Picking,Bewegen.
    Habe noch ein Youtupe Video wenn es jemanden interessiert ^^

    Problem ist :
    Ich möchte gerne die OpenGL Buffer werte ändern ohne alles neu zu binden
    Im Internet ist nichts in VB mit Opengl zu finden :(
    ------------
    beispiel 1:
    Vertices(200000) und UV(200000) ' laufen beide Parallel Extra Dim(Vertex(1, 1, 1)),UV(1, 1)
    Vertices 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...-> 200.000
    Ich möchte gerne die Vertices,UV Zahl von 5 bis 8 zu ändern, ohne den Buffer
    zu Löschen und ohne alles neu zu Binden wenn mann 200.000 Vertices Zahlen voll hat zieht das an der Engine
    ----------------------------
    beispiel 2:
    Button1, ist der es die Vertices,uv Füllen tut
    Button2, ist der ein teil nullen tut

    gegeben ist :

    Public indexBufferId2As UInteger
    Public vertexBufferId2As UInteger
    Public Textbuffer2 As UInteger
    Public Vertices(200000) As Vertex
    Public uv(200000) As Vector2

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    For A = 1 To 200000 Step 1
    Vertices(a) = New Vertex(1, 1, 1)
    uv(a) = New Vector2(1, 1)
    Next

    Try
    GL.DeleteBuffers(1, indexBufferId2)
    GL.DeleteBuffers(1, Textbuffer2)
    GL.DeleteBuffers(1, vertexBufferId2)
    Catch ex As Exception

    End Try

    Dim indices2() As UShort = {0, 1, 2, 3}
    GL.GenBuffers(1, indexBufferId2)
    GL.BindBuffer(BufferTarget.ElementArrayBuffer, indexBufferId2)
    GL.BufferData(BufferTarget.ElementArrayBuffer, New IntPtr(indices2.Length * BlittableValueType.StrideOf(indices2)), indices2, BufferUsageHint.StaticDraw)

    GL.GenBuffers(1, vertexBufferId2)
    GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferId2)
    GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(Vertices2.Length * BlittableValueType.StrideOf(Vertices2)), Vertices2, BufferUsageHint.StaticDraw)

    GL.GenBuffers(1, Textbuffer2)
    GL.BindBuffer(BufferTarget.ArrayBuffer, Textbuffer2)
    GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(uv2.Length * BlittableValueType.StrideOf(uv2)), uv2, BufferUsageHint.StaticDraw)
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    For A = 5 To 8 Step 1
    Vertices(a) = New Vertex(0, 0, 0)
    uv(a) = New Vector2(0, 0)
    Next

    ' Gibts es nicht was mit UNLOCK mit Vertices+ UV
    ' IN Internet , Bücher finde ich nichts was auf VB mit OpenGL basiert
    ' Die sollen genullt werden zum neu beschreiben

    End Sub

    CustomVertex ? gibt es nicht sagt er ! Vertex und UV laufen in einer Extra Dimension bei mir

    Dim vertex As CustomVertex.PositionColored() = _
    CType(VertexBuf.Lock(0, LockFlags.None), CustomVertex.PositionColored())
    vertex(0) = New CustomVertex.PositionColored(0, 1, 0, Color.Blue.ToArgb)
    vertex(1) = New CustomVertex.PositionColored(1, -1, 0, Color.Red.ToArgb)
    vertex(2) = New CustomVertex.PositionColored(-1, -1, 0, Color.Green.ToArgb)
    VertexBuf.Unlock()


    ---------------------------------------
    Frage 2: nur wenn frage 1 nicht lösbar ist ^^
    Wie kann ich ein 2 stelliges Arry binden ohne 2 mal abzufragen ?

    Dim Vertices2(100,8000)
    Dim Block as integer = Straße
    Dim X as integer = Haus
    Chunk = 1

    GL.GenBuffers(1, vertexBufferId2(Chunk))
    GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferId2(Chunk))
    GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(Vertices2(Block,X).Length * BlittableValueType.StrideOf(Vertices2(Block,X)), Vertices2(Block,X), BufferUsageHint.StaticDraw

    So geht das auch nicht :(




    Vielen Dank für durchlesen ^^
    es gibt einerseits BufferSubData um Datenbereiche in VBOs zu updaten, andererseits gibt es noch MapBuffer/UnmapBuffer, womit man jenach Anwendungsfall noch mehr performance raus holen kann, aber dabei muss man vorsichtig sein, denn Grundsätzlich übernimmt OGL dabei keine Synchronisation und musst du selbst auf irgendeine Art Sicherstellen, dass der Buffer nicht verwendet wird während du versuchst ihn zu schreiben...

    Edit:
    Frage Zwei....
    Name der Klassen ist egal. OGL selbst hat kein CustomVertex. Mach dir einfach selbst eine struct und geb die vorhandenen Attribute in einem VAO an. Gibt es tausende Tutorials dafür und wenn es nicht für VB ist, dann ist das egal, ist nicht viel anders als mit allem anderen auch. statt gl[XXX] ists halt GL.[XXX]. Und manche Daten muss man auf andere Art übergeben. Aber im Grunde bleiben die Funktionen gleich und falls du OpenTK verwendest übernimmt das auch vieles für dich...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke jvbsl für den weg naja ^^.

    Klaube es weiß keiner so richtig wie es geht^^.

    Und es gibt auch keine richtige Deutsche Seite.Keine legende oder Lösung die BufferSubData erklären tut von bis und warum!!!
    Nach 18 %&$§ Stunden Googeln in Internet ( Marshal.Copy ,Pufferange,BufferSubData,Buffer.BlockCopy )alles nur English und nur Size,flat,offsize,target als (Gryptonisch) zu lesen !!
    habe ich es raus bekommen als ich aufgeben wollte !!

    BufferSubData <-- ging ^^


    Hier Video das es geht ^^^^^^. sind noch viele Testcode zu sehen ^^


    Public VertexspeicherADD1(505, 300000) As Vertex
    Public Vertices2(23) As Vertex
    Public uv2(23) As Vector2

    gluUnProject = mit ReadRixel daten geholt X1 Y1 Z1
    MausklickDim2 = die Dim Zeile aus (VertexspeicherADD1 X2,Y2,Z2)
    Z.B.
    For H = 1 To Block_Speicher_länge(MausChunks) Step 24
    Select Case x1
    Case VertexspeicherADD1(MausChunks, H + 21).X - 5 To VertexspeicherADD1(MausChunks, H + 17).X + 5
    TempWelt4 = H
    End Select
    next
    if X,Y,Z = Stimmen alle überein dann weiter
    Sub Löschung
    For Z As Integer = MausklickDim2 To MausklickDim2 + 23
    VertexspeicherADD1(MausChunks, Z) = New Vertex(0, 0, 0)
    VectorSpeicherADD1(MausChunks, Z) = New Vector2(0, 0)
    Next

    For Copier = 0 To 23 '23 + ZeileSetzer
    Vertices2(Copier) = VertexspeicherADD1(MausChunks, MausklickDim2 + Copier)
    uv2(Copier) = VectorSpeicherADD1(MausChunks, MausklickDim2 + Copier)
    Next
    end sub
    Sub BufferEdit

    GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferId2(MausChunks))
    GL.UnmapBuffer(BufferTarget.ArrayBuffer)

    GL.BufferSubData(BufferTarget.ArrayBuffer, MausklickDim2 * BlittableValueType.StrideOf(Vertices2), Vertices2.Length * BlittableValueType.StrideOf(Vertices2), Vertices2)
    GL.BindBuffer(BufferTarget.ArrayBuffer, 0)
    end sub
    -----------------------------------------------
    Beispiele:
    GL.BufferSubData(Ziel des Buffers, Start *X, Ende *X, Von wo Dimension)
    GL.BufferSubData(BufferTarget.ArrayBuffer, Vertices zeile *X, Größe des Vertices *X, Von wo Dimension)
    GL.BufferSubData(BufferTarget.ArrayBuffer, 25 *X, 48 *X, Von wo Dimension)

    *X =(BlittableValueType.StrideOf(Vertices2)
    *X =(BlittableValueType.StrideOf(Von wo Dimension)

    Die (Von wo Dimension) sollte nicht größer sein als (Start und ende Buffers)

    Ich mag C++ und java nicht sind nicht lern-freundlich
    VB geht ca 10 % langsamer aber mann lernt es ohne zu lernen 100 mal schneller


    Danke
    Bitte setz deinen Code in die VB-Tags...Und wie kommst du darauf, dass niemand weiß wie es geht? Nur weil ich dir keinen fertigen SourceCode geliefert habe? Anscheinend haben meine Stichworte ja ganz gut gereicht :P

    Dein UnmapBuffer aufruf ist total unnötig(und sogar falsch)...

    statt 23 zu nehmen verwende doch bitte die größe des Arrays direkt über VertexspeicherADD1.Length.

    C++ und Java sind so ein großer unterschied, dass ich deine Aussage, dass diese nicht lernfreundlich sind von mir nicht ernst genommen werden kann. Vorallem da Java zu den lernfreundlichsten Sprachen überhaupt gehört.
    Der größte Unterschied zwischen Java und VB.Net ist die Syntax, die restlichen Unterschiede sind für Anfänger erst einmal ziemlich unbedeutend...

    VB.Net ist auch nicht grundsätzlich so viel langsamer als C++ oder Java. Es kommt stark auf die Algorithmen an. Es gibt sogar Dinge die du in VB.Net performanter machen kannst als in Java(aber nie als in C++)...

    Deutsche Quellen haben oft ein großes Problem und bei Grafikprogrammierung ist das noch viel auffälliger als schon bei der Allgemeinen Programmierung: Es gibt nur sehr wenige Quellen und davon sind die meisten von Anfängern die vieles so machen wie man es nicht machen sollte. Wie immer gibt es ausnahmen diese sind aber wenig. Bei VB.Net spezifisch wird es dann natürlich noch schwieriger, da in dieser Sprache nur ein sehr sehr kleiner Bruchteil arbeitet...

    P.S.: Man spricht es eher Vertisiis. Und ReDim ist böses altes VB 6 erzeug einfach ein neues Array, oder wenn du etwas brauchst was die Daten behalten soll und dabei die größe ändert dann verwende List(Of T)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    jvbsl schrieb:

    Es gibt nur sehr wenige Quellen und davon sind die meisten von Anfängern die vieles so machen wie man es nicht machen sollte.


    Deshalb verstehe ich nicht warum man überhaupt auf solche Quellen zurückgreift. Meiner Meinung nach gehört Verständnis der englischen Sprache auch zur Informatik dazu. Deutsche Variablenbenennung etc. finde ich auch sehr unschön, weil meiner Ansicht nach OpenSource immer der beste Weg ist und jeder die Chance haben sollte den Code lesen zu können.