Rendern einer Voxelwelt

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Rendern einer Voxelwelt

Beitrag von focus0941 »

Ich möchte gerne das Rendern meiner Voxelwelt optimieren. Dazu sollen nur Flächen gerendert werden, die man sehen kann. Allerdings wären dann manche Punkte doppelt. Ich dachte man könnte es mit Indexen lösen, komme aber nicht drauf wie.
Hier ist mein bisheriger Code:

Code: Alles auswählen

package terrain;

import models.CubeModel;
import org.joml.Vector3f;
import org.joml.Vector3i;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ChunkMesh {
    private List<Vertex> vertices;
    private List<Float> positionList;
    private List<Float> uvList;
    private List<Float> normalList;
    public float[] positions;
    public float[] uvs;
    public float[] normals;
    public Chunk chunk;

    public ChunkMesh(Chunk chunk) {
        this.chunk = chunk;
        vertices = new ArrayList<>();
        positionList = new ArrayList<>();
        uvList = new ArrayList<>();
        normalList = new ArrayList<>();
        buildMesh();
        populateList();
    }

    public void update(Chunk chunk) {
        this.chunk = chunk;
        buildMesh();
        populateList();
    }

    private void buildMesh() {
        HashMap<Vector3i, Voxel> voxelMap = new HashMap<>();

        for (Voxel voxel : chunk.blocks) {
            voxelMap.put(voxel.position, voxel);
        }

        Vector3i tempPos = new Vector3i();

        for (Voxel voxelI : chunk.blocks) {
            Vector3i position = voxelI.position;
            int x = position.x;
            int y = position.y;
            int z = position.z;

            boolean px = voxelMap.containsKey(tempPos.set(x + 1, y, z));
            boolean nx = voxelMap.containsKey(tempPos.set(x - 1, y, z));
            boolean py = voxelMap.containsKey(tempPos.set(x, y + 1, z));
            boolean ny = voxelMap.containsKey(tempPos.set(x, y - 1, z));
            boolean pz = voxelMap.containsKey(tempPos.set(x, y, z + 1));
            boolean nz = voxelMap.containsKey(tempPos.set(x, y, z - 1));

            if (!px) {
                addVoxelFace(CubeModel.facePX, voxelI);
            }

            if (!nx) {
                addVoxelFace(CubeModel.faceNX, voxelI);
            }

            if (!py) {
                addVoxelFace(CubeModel.facePY, voxelI);
            }

            if (!ny) {
                addVoxelFace(CubeModel.faceNY, voxelI);
            }

            if (!pz) {
                addVoxelFace(CubeModel.facePZ, voxelI);
            }

            if (!nz) {
                addVoxelFace(CubeModel.faceNZ, voxelI);
            }
        }
    }

    private void addVoxelFace(Vector3f[] face, Voxel voxel) {
        for (int k = 0; k < 6; k++) {
            vertices.add(new Vertex(new Vector3f(face[k].x + voxel.position.x, face[k].y + voxel.position.y, face[k].z + voxel.position.z), CubeModel.NORMALS[k], CubeModel.UVS[k]));
        }
    }

    private void populateList() {
        for (Vertex vertex : vertices) {
            positionList.add(vertex.positions.x);
            positionList.add(vertex.positions.y);
            positionList.add(vertex.positions.z);
            normalList.add(vertex.normals.x);
            normalList.add(vertex.normals.y);
            normalList.add(vertex.normals.z);
            uvList.add(vertex.uvs.x);
            uvList.add(vertex.uvs.y);
        }

        positions = new float[positionList.size()];
        uvs = new float[uvList.size()];
        normals = new float[normalList.size()];

        for (int i = 0; i < positionList.size(); i++) {
            positions[i] = positionList.get(i);
        }

        for (int i = 0; i < uvList.size(); i++) {
            uvs[i] = uvList.get(i);
        }

        for (int i = 0; i < normalList.size(); i++) {
            normals[i] = normalList.get(i);
        }

        positionList.clear();
        uvList.clear();
        normalList.clear();
    }
}
Benutzeravatar
Schrompf
Moderator
Beiträge: 4890
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Rendern einer Voxelwelt

Beitrag von Schrompf »

Ich hab mir jetzt nicht die Mühe gemacht, Deinen Code zu verstehen. Daher nur aufgrund des Fließtextes:

Erster Aufschlag: nimm die Dopplungen in Kauf. Dein Problem wird höchstwahrscheinlich nicht das GPU Vertex Processing sein, und nur da hilft gutes Indexing.

Zweiter Aufschlag: Das Einzige, was Du meiner Meinung nach sharen kannst, sind die 4 Vertizes einer Würfel-Seite. Und die kannst Du ja einfach so schreiben: aktuelle VertexAnzahl merken als Basis-Index, vier Vertizes in den VertexBuffer, 6 Indizes in den IndexBuffer (BasisIndex, BasisIndex+1, BasisIndex+2, BasisIndex+1, BasisIndex+3, BasisIndex+2). Fertsch.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Die Vertices sind alle schon als Array für einen Würfel vorgegeben, man muss nur die position in der welt hinzuaddieren (siehe addVoxelFace()).
Die Indices zu vergeben war auch kein Problem, allerdings kommt etwas heraus, was ich mir nicht erklären kann.
Dateianhänge
das ist eigentlich ein würfel
das ist eigentlich ein würfel
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 586
Registriert: 05.07.2003, 11:17

Re: Rendern einer Voxelwelt

Beitrag von Lord Delvin »

Wie sollte es denn aussehen?
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

So, aber so sind die Vertices vierfach im Arbeitsspeicher.
Dateianhänge
eigentlich.png
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

ich könnte auch raycasting versuchen, es soll mit svos schneller sein und damit habe ich mehr erfahrung
NytroX
Establishment
Beiträge: 372
Registriert: 03.10.2003, 12:47

Re: Rendern einer Voxelwelt

Beitrag von NytroX »

Versuch doch mal den Fehler einzugrenzen, indem du nur einen Teil renderst.
Im Bild sieht das so aus als wäre das Problem auch mit 2x2 reproduzierbar.
Und dann schau dir das Ganze im Debugger an.

Denk dran, dass du die Vertices im Uhrzeigersinn durchlaufen musst (oder Gegen den Uhrzeigersinn, je nach Einstellung) und schau nochmal ob die Indices dazu passen.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 586
Registriert: 05.07.2003, 11:17

Re: Rendern einer Voxelwelt

Beitrag von Lord Delvin »

Irgendwie ist auch seltsam, dass die Texturkoordinaten offenbar nicht überall passen.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Die Texturkoordinaten passen nicht, da ein Vertex bisher nur eine Texturkoordinate haben kann, aber 4 Mal genutzt wird.
joeydee
Establishment
Beiträge: 1059
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Rendern einer Voxelwelt

Beitrag von joeydee »

(Weiß nicht genau ob ich das Problem richtig verstehe)
Ich nehme generell unique Vertices, also [Position, Normale, UV, Farbe, ...] als Einheit. Ja, Positionen doppeln sich dann. Aber z.B. die Normalendaten doppeln sich noch mehr bei einer Voxelwelt, es gibt ja nur 6 verschiedene.
Ob/wie man das sonst mit Vertex- und Indexbuffern (mit Bordmitteln außerhalb von Shaderakrobatik) praktisch beliebig "interleaven" könnte bin ich überfragt, da wären ja theoretisch mehrere Indexbuffer je Drawcall nötig oder so.
Mit Shaderakrobatik, falls die Version es hergibt: nur IDs in den VB packen (posID, normID, uvID, ...), und dann Lookups auf Arrays (alle Positionen, Normalen, UVs, ...) im Shader.

Die Frage ist halt, ob man wirklich auf diese Art an der Datenmenge sparen muss, und ob es unterm Strich überhaupt einen Gewinn bringt.
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Das Problem ist gelöst worden, aber nun ist die Frage welchen Algorithmus ich verwenden sollte (, damit das Terrain nicht so würfelig aussieht).
NytroX
Establishment
Beiträge: 372
Registriert: 03.10.2003, 12:47

Re: Rendern einer Voxelwelt

Beitrag von NytroX »

Das kommt ja drauf an, was du erreichen willst.
Minecraft und Roblox bleiben einfach bei den Würfeln.
Wenn du keine Würfel willst, musst du ja eine andere Idee haben - aber dann wäre halt die Frage warum du die Welt mit Würfeln gebaut hast.
Welche Algorithmen hast du dir denn dazu angeschaut?
Und: willst du nur eine optische Aufwertung, oder betrifft das dann auch Physik & Co. ?

Vielleicht gibts hier was für dich: https://github.com/andygeers/DualMarchi ... lated-work
Benutzeravatar
Jonathan
Establishment
Beiträge: 2406
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Rendern einer Voxelwelt

Beitrag von Jonathan »

Man kann natürlich Splines (Bezier, NURBS, etc.) verwenden um aus den eckigen Würfel eine beliebig glatte Oberfläche zu machen. Ist für beliebige Voxelsturkturen vermutlich etwas kniffeliger, insbesondere wenn die Oberfläche nicht nur von den direkten Nachbarn abhängen soll.

Ein bisschen weniger technisch: Die Frage ist wirklich, wie du dir das Ergebnis vorstellst. Wenn man eine klassische Treppen aus Voxel baut (immer eins hoch und eins zur Seite), soll man dann am Ende eine Treppe mit abgerundeten Kanten sehen? Oder soll man eine perfekte 45 Grad Schräge sehen, bei der man die ursprüngliche Treppe nicht mehr erkennen kann? Das wäre 2 verschiedene Abstufungen von "glatt". Je glatter es aber wird, desto weniger bleibt von jedem einzelnen Würfel "übrig", weil es ja eben rausgeglättet wird.

Um es kurz zu machen: Deine Voxelwelt wird vermutlich immer nach Würfel aussehen. Ich stimme Nytrox da voll zu, die Welt sieht nach Würfeln aus, weil sie aus Würfeln besteht, wenn man das nicht möchte sollte man sie nicht aus Würfeln bauen. Man könnte z.B. etwas mit Heightmaps machen. Oder voll Richtung CSG gehen, dazu hatte Schrompf mal ein paar Experimente vorgestellt (meine ich) die ich aber gerade nicht mehr wiederfinde. Das hatte Red Faction 1 ja damals gemacht und es war absolut beeindruckend und so ähnlich funktionieren heute auch die zerstörbaren Gebäude in Multiplayershootern, aber einfach ist das halt auch alles nicht.

Die zentrale Frage bleibt also, was genau die eigentlich erreichen willst. Mal das halt mal auf, dann wird dir vlt. sogar schon einiges selbst klar.
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Naja, nach einigen (langen) Recherchen, fand ich Dual-Contouring, Cubical Marching Squares, etc., was jedoch Hermite-Data benötigte, also habe ich mich für das einfachere Adaptive Marching Cubes entschieden und eine Octree-Struktur aus den Voxeln gemacht. Allerdings bin ich vor ca. 3 Wochen auf einen Bug gestoßen, den ich seit dem noch nicht lösen konnte :,(
Benutzeravatar
Schrompf
Moderator
Beiträge: 4890
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Rendern einer Voxelwelt

Beitrag von Schrompf »

Weiß jetzt nicht, was Hermite-Data sein soll, aber allgemein: Du hast Voxel im Sinne von "Anwesend oder nicht" und die ganzen Surface Generation-Algorithmen nehmen auch anteilige Anwesenheit, also nen Wert zwischen 0 und 1. Du kannst die also erstmal alle benutzen und plump 0.0f oder 1.0f eintragen und sehen, wie es damit läuft. Für schönere Oberflächen mit Schrägen und so wären dann später aber anteilige Voxel ein Fortschritt.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Hermiteinterpolation ist ein Interpolationsverfahren zur Polynominterpolation, das auch Ableitungen der zu interpolierenden Funktion berücksichtigt (https://de.wikipedia.org/wiki/Hermiteinterpolation). Hermite-Data ist der daraus entstandene Wert für jede Verbing zwischen zwei in einem Gitter anliegenden Voxeln.

Der Bug, den ich vorher erwähnte, ist, dass ein Array nach einer Iteration plötzlich nur noch aus Nullvektoren, statt den entsprechenden Positionen besteht, obwohl er in keiner Weise verändert wird.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 586
Registriert: 05.07.2003, 11:17

Re: Rendern einer Voxelwelt

Beitrag von Lord Delvin »

Naja aber wenn du's in Java machst, uses aufzählen, breakpoint, ausgaben; sollte schnell gefunden sein.
Was ich ehrlich gesagt nicht ganz verstehe, ist wie deine Interpolation am Ende in Dreiecke übersetzt wird.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Also ich benutze das Hermiteinterpolationsverfahren gar nicht. Das habe ich nur mal versucht. Allerdings funktioniert bein mir das stinknormale Marching Cubes auch nicht (siehe Bild) und ich weiß nicht warum.
So sieht das aus.
So sieht das aus.
Benutzeravatar
Jonathan
Establishment
Beiträge: 2406
Registriert: 04.08.2004, 20:06
Kontaktdaten:

Re: Rendern einer Voxelwelt

Beitrag von Jonathan »

Naja, der Standardansatz ist ja zu versuchen das Problem so lange zu vereinfachen, bis man genau weiß, welches man Ergebnis man erwartet, dann mit dem was man bekommt zu vergleichen und zu verstehen woran es liegt.

Insgesamt ist deine Fehlerbeschreibung ziemlich nichtssagend, so kann hier niemand etwas sinnvolles dazu sagen. Es ist ja noch nicht einmal genau spezifiziert, was du eigentlich machen will. Es gibt tausend Arten Marching Cubes zu implementieren, welche versuchst du also gerade?
Lieber dumm fragen, als dumm bleiben!
https://jonathank.de/games/
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Ich habe das so verstanden, dass man eine Triangletable, eine Edgemask und die dazugehörigen Edgevertexindices braucht, sodass man dann in einem Würfel einen aus 256 Fällen durch die Konfiguration der Werte der Ecken bestimmt, dann eine Position für die nötigen Vertices durch Interpolieren kriegt und in der von der Triangletable gegebenen Reihenfolge in den Positions-Array und Indices-Array tut, mit denen dann das letztlich das Mesh rendert. Falls es hilft: hier ist der Code (ohne Tabellen und aufgerufene Methoden):

Code: Alles auswählen

private static void processNode(Node node, Octree octree) {
        if (node.getDepth() == Settings.maxDepth && !octree.isOutOfBounds(node.getOrigin())) {
            Node[] cube = {
                    node,
                    octree.get(new Vector3f(node.getOrigin().x + node.getSize(), node.getOrigin().y,                  node.getOrigin().z)),
                    octree.get(new Vector3f(node.getOrigin().x,                  node.getOrigin().y + node.getSize(), node.getOrigin().z)),
                    octree.get(new Vector3f(node.getOrigin().x + node.getSize(), node.getOrigin().y + node.getSize(), node.getOrigin().z)),
                    octree.get(new Vector3f(node.getOrigin().x,                  node.getOrigin().y,                  node.getOrigin().z + node.getSize())),
                    octree.get(new Vector3f(node.getOrigin().x + node.getSize(), node.getOrigin().y,                  node.getOrigin().z + node.getSize())),
                    octree.get(new Vector3f(node.getOrigin().x,                  node.getOrigin().y + node.getSize(), node.getOrigin().z + node.getSize())),
                    octree.get(new Vector3f(node.getOrigin().x + node.getSize(), node.getOrigin().y + node.getSize(), node.getOrigin().z + node.getSize()))
            };
            
            int cubeIndex = 0;

            for (int i = 0; i < 8; i++) {
                if (cube[i].getValue() > 0) {
                    cubeIndex |= 1 << i;
                }
            }

            int edgeMask = EdgeMasks[cubeIndex];

            if (edgeMask == 0) {
                return;
            }

            Vector3f[] edgeVertices = new Vector3f[12];

            for (int i = 0; i < 12; i++) {
                if ((edgeMask & (1 << i)) != 0) {
                    edgeVertices[i] = interpolate(cube[EdgeVertexIndices[i][0]].getOrigin(), cube[EdgeVertexIndices[i][1]].getOrigin(), cube[EdgeVertexIndices[i][0]].getValue(), cube[EdgeVertexIndices[i][1]].getValue());
                }
            }

            Vector3f tempPos;

            for (int i = 0; TriangleTable[cubeIndex][i] != -1; i++) {
                tempPos = edgeVertices[TriangleTable[cubeIndex][i]];
                int index;

                if (positionIndices.containsKey(tempPos)) {
                    index = positionIndices.get(tempPos);
                } else {
                    positions.add(tempPos);
                    index = positions.size() - 1;
                    positionIndices.put(tempPos, index);
                }

                indices.add(index);
            }
        } else {
            if (!node.isLeaf()) {
                for (Node child : node.getChildren()) {
                    processNode(child, octree);
                }
            }
        }
    }
NytroX
Establishment
Beiträge: 372
Registriert: 03.10.2003, 12:47

Re: Rendern einer Voxelwelt

Beitrag von NytroX »

Gib doch einfach in der Console mal die Fälle aus, die selektiert worden sind.
Und versuche deine Geometrie zu reduzieren, auf z.B. einen Würfel. Du zeichnest ja schon irgendwie 4x4 oder so mit weiß nicht wie vielen Fällen.
Versuch doch mal 1x1, und dann 1x2. Und dazu gibst du in der Console die Fälle aus, die dein Algorithmus gewählt hat.

Und im nächsten Schritt dazu die Dreiecke, die du berechnet hast. Einfach als Zahlen, ohne Grafik. Und dann schau, ob es richtig ist.

Und dann Schritt für Schritt erweitern auf 2x2 und dann erst 4x4.

Oder mach es erstmal in 2d, um ein Gefühl für den Algorithmus zu bekommen.
Aus einem 3x3 Gitter:
0 0 0
0 1 0
0 0 0
Sollten ja dann 4 Fälle werden.
Und daraus 4 Dreiecke.
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Hab's mit einem normalen Array ganz einfach hinbekommen, aber nun, wie man auch im Bild sieht, sind manche Dreiecke nicht vorhanden.
06.11.2023.png
06.11.2023 (2).png
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 586
Registriert: 05.07.2003, 11:17

Re: Rendern einer Voxelwelt

Beitrag von Lord Delvin »

Aber wenn die wireframe da sind hast du sie bestimmt falschrum angelegt und verlierst sie ans backface culling
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Am Backface-Culling liegt es nicht. Ich habe aber gemerkt, dass es 4 Fälle gibt, in denen aus irgendeinem Grund kein Dreick gerendert wird, obwohl die Berechnung durchgeführt wurde.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4890
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Rendern einer Voxelwelt

Beitrag von Schrompf »

Nimm Dir NVidia NSight oder RenderDoc und finde es heraus. Das sind beides Frame Debugger, die Dir in Deine OpenGL-Calls reinleuchten können oder in einzelne Dreiecke oder sogar in einzelne Pixel.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
focus0941
Beiträge: 40
Registriert: 27.03.2023, 18:28
Benutzertext: hatte mit 3 einen Bart
Echter Name: Vladimir Ilyushko

Re: Rendern einer Voxelwelt

Beitrag von focus0941 »

Das RenderDoc kann ich leider nicht verwenden, weil mein Programm nicht kompiliert ist, aber ich habe etwas herausgefunden, und zwar, dass alls funktioniert, wenn man

Code: Alles auswählen

if (z == 0 && y == 0) {
                        values[x + (y * chunkSize) + (z * chunkSize * chunkSize)] = 1;
                    } else {
                        values[x + (y * chunkSize) + (z * chunkSize * chunkSize)] = 0;
                    }
schreibt, aber nicht wenn die Bedingung z >= y lautet, obwohl es an der Stell Stell y=0, z=0 das selbe Ergebnis geben sollte.
NytroX
Establishment
Beiträge: 372
Registriert: 03.10.2003, 12:47

Re: Rendern einer Voxelwelt

Beitrag von NytroX »

Hmm, also mir ist völlig unklar, warum du ein values array hast, in dem 1 oder 0 steht. Da können wir nicht helfen, da musst du ja selbst wissen wozu das gut ist und was es tut.

Btw: dein Programm wird immer compiliert, wenn du es startest, sonst würde es nicht laufen.
Wenn du es aktuell nur im Debugger startest, dann bau es halt einfach - ist ja nicht schlimm wenn es nur eine Zwischenversion ist.
Ich würde dir dringend empfehlen sowas wie RenderDoc zu benutzen - du wirst in Zukunft auf noch mehr solche subtile und ähnliche Fehler stoßen, und dann kannst du sie nicht richtig analysieren.

Hier gibt es ein Tutorial dazu, wie man RenderDoc mit Java einrichtet:
https://ahbejarano.gitbook.io/lwjglgamedev/appendix-a
Antworten