Ostatnie wiadomości

Strony: [1] 2 3 4 5 ... 10
1
OpenGL / QuadTree/LOD przy renderowaniu terenu
« Ostatnia wiadomość wysłana przez Dragomirus dnia Dzisiaj o 05:54:13 »
Witam,
jeżeli temat nie pasuję to działu to proszę o przeniesienie bo za bardzo nie wiedziałem gdzie go dać.

Ostatnio dwoje się i troje żeby rozwiązać pewien problem związany z renderowaniem terenu. Otóż na początku wyświetlałem mój teren jako jedną wielką siatkę (która zajmowała jedno VAO w openGLu), teraz jednak chciałbym usprawnić to wyświetlanie poprzez dodanie LOD. Zacząłem od implementacji drzewa czwórkowego. Najważniejsza metoda to ta:
/**
 * Render tile
 * @param program - shader program
 */
public void render(Camera camera, Shader program)
{
    if(camera.hasMoved())
        this.quadtree.updateQuadTree(camera);

    this.quadtree.render(program);
}

/**
 * Update quadtree
 * @param camera - camera
 */
public void updateQuadTree(Camera camera)
{
    for(Node node : getChildren())
        ((TerrainTreeNode) node).updateQuadtree(camera);
}

Następnie zaimplementowałem element tego drzewa i najważniejsze jego metody to te:
/**
 * Update quad tree
 * @param camera - camera
 */
public void updateQuadtree(Camera camera)
{
    updateChildNodes(camera.position);

    for(Node node : getChildren())
    {
        ((TerrainTreeNode) node).updateQuadtree(camera);
    }
}

/**
 * Update child nodes
 * @param cameraPosition - camera position
 */
private void updateChildNodes(Vector3f cameraPosition)
{
    Vector3f tempCamera = new Vector3f(cameraPosition);
    Vector3f tempPosition = new Vector3f(this.position);
    Vector3f.sub(tempCamera, tempPosition, tempCamera);
    float distance = tempCamera.length();

    switch(this.lod)
    {
        case 0:
            if(distance < 1750)
            {
                addChildNodes(this.lod+1);
            }
            else if(distance >= 1750)
            {
                removeChildNodes();
            }
            break;

        case 1:
            if(distance < 874)
            {
                addChildNodes(this.lod+1);
            }
            else if(distance >= 874)
            {
                removeChildNodes();
            }
            break;

        case 2:
            if(distance < 386)
            {
                addChildNodes(this.lod+1);
            }
            else if(distance >= 386)
            {
                removeChildNodes();
            }
            break;

        case 3:
            if (distance < 192)
            {
                addChildNodes(this.lod+1);
            }
            else if(distance >= 192)
            {
                removeChildNodes();
            }
            break;

        case 4:
            if(distance < 100)
            {
                addChildNodes(this.lod+1);
            }
            else if(distance >= 100)
            {
                removeChildNodes();
            }
            break;

        case 5:
            if(distance < 50)
            {
                addChildNodes(this.lod+1);
            }
            else if(distance >= 50)
            {
                removeChildNodes();
            }
            break;

        case 6:
            if(distance < 0)
            {
                addChildNodes(this.lod+1);
            }
            else if(distance >= 0)
            {
                removeChildNodes();
            }
            break;

        case 7:
            if (distance < 0)
            {
                addChildNodes(this.lod+1);
            }
            else if(distance >= 0)
            {
                removeChildNodes();
            }
            break;
    }
}

/**
 * Add child nodes
 * @param lod - level of detail
 */
public void addChildNodes(int newLod)
{
    if(isLeaf)
    {
        isLeaf = false;
        if(this.mesh != null)
            this.mesh.dispose();
    }
    if(getChildren().size() == 0)
    {   
        float newWidth = this.width/2f;
        float newWidth2 = newWidth/2f;
        for(int i = 0; i < 2; i++)
        {
            for(int j = 0; j < 2; j++)
            {
                float first, second;
                if(i == 0)
                    first = -(newWidth/2f);
                else
                    first = newWidth/2f;
                if(j == 0)
                    second = -(newWidth/2f);
                else
                    second = newWidth/2f;

                Vector3f newPosition = new Vector3f(this.position.x+first,
                        0f, this.position.z+second);
                addChild(new TerrainTreeNode(newPosition,
                        newLod,
                        new Vector2f(i, j),
                        newWidth));
            }
        }
    }   
}

/**
 * Remove child nodes
 */
private void removeChildNodes()
{
    if(!isLeaf)
    {
        isLeaf = true;
        this.mesh = generateMesh();

    }
    //Remove childrends
    if(getChildren().size() != 0)
    {
        for(Node child : getChildren())
            child.dispose();

        getChildren().clear();
    }
}

Jak widać mój element drzewa albo jest gałęzią i wtedy posiada dzieci, albo jest liściem i wtedy posiada własne VAO (jest to 10 wierzchołków z czego pierwszy jest na środku kwadratu, a pozostałe na krawędziach tego kwadratu, sposób wyświetlania to triangle fan). Całość dziala bardzo ładnie i utrzymuje się te 60 klatek jednak pojawił się problem. Pomiędzy elementami drzewa, które mają różny LOD pojawiają się dziury. Nie mam pojęcia za bardzo jak je załatać chociaż mam taki pomysł, żeby obok każdego stworzonego w liściu VAO dodatkowo przechowywać jeszcze 8 permutacji tak jak opisano to w tym dokumencie: http://www.dice.se/wp-content/uploads/2014/12/Chapter5-Andersson-Terrain_Rendering_in_Frostbite.pdf -> strona 53-55.
Jednak nadal nie mam pojęcia skąd mam wiedzieć jaką permutacje obecnie wyświetlić. Ponad to mam pomysł żeby wyszukiwać LOD sąsiadów danego liścia (górnego, dolnego, prawego i lewego) i na podstawie tego wybrać permutacje, ale również nie mam pojęcia jak to wyszukać.

Byłbym wdzięczny za każdą pomoc. Wiem, że w OpenGLu 4.0 jest tesalacja, która wszystko robi za nas i nie trzeba się martwić o dziury, ale jednak póki co wolałbym pozostać przy wersji 3.3.
2
Wydarzenia / Odp: Eventy
« Ostatnia wiadomość wysłana przez matheavyk dnia Lipiec 20, 2017, 19:42:51 »
Można obserwować na fb stronkę jakiegoś growego koła naukowego z pobliskiej uczelni.
3
Wydarzenia / Odp: Eventy
« Ostatnia wiadomość wysłana przez koirat dnia Lipiec 20, 2017, 17:04:39 »
Heja, z jakich stron korzystacie zeby sie dowiedziec o eventach z branzy? Wyklady i takie tam
Robimy gry, nie mamy czasu na eventy ;)
4
Wydarzenia / Odp: Eventy
« Ostatnia wiadomość wysłana przez ekhart dnia Lipiec 20, 2017, 12:30:17 »
Jak ktoś lubi gamejamy to polecam stronę znajomego jammera ;)
Kalendarz polskich game jamów
5
Wydarzenia / Eventy
« Ostatnia wiadomość wysłana przez stefanozord dnia Lipiec 20, 2017, 11:08:34 »
Heja, z jakich stron korzystacie zeby sie dowiedziec o eventach z branzy? Wyklady i takie tam
6
Oferuję / Odp: Programista C#
« Ostatnia wiadomość wysłana przez stefanozord dnia Lipiec 19, 2017, 19:42:56 »
A Ty chyba zgubiles kropke. :D
7
Oferuję / Odp: Programista C#
« Ostatnia wiadomość wysłana przez Sarann dnia Lipiec 19, 2017, 15:18:45 »
Witam jestem programistą od kilku lat. Jestem studentem informatyki analitycznej. Głównie programuje w C# oraz w Unity. Mam doświadczenie w pracy z paroma firmami.
Gdybyś szukał programisty pisz na PW
lub na email petkakuba@gmail.com
programuję*
"programuje" byłoby gdyby ktoś programował, np "on programuje"
8
Oferuję / Odp: Programista C#
« Ostatnia wiadomość wysłana przez kuba648 dnia Lipiec 19, 2017, 09:42:13 »
Oferta jest nadal aktualna jakby ktoś szukał
9
Oferuję / Odp: Wykonam: Concept Art/Ilustracje/Grafika 2D
« Ostatnia wiadomość wysłana przez isia dnia Lipiec 18, 2017, 14:55:21 »
Tak, z tego co pamiętam to były połączone dwa zdjęcia + paintover.
10
Oferuję / Odp: Wykonam: Concept Art/Ilustracje/Grafika 2D
« Ostatnia wiadomość wysłana przez JasonVoorhees dnia Lipiec 17, 2017, 21:58:56 »
http://ifwerelost.daportfolio.com/gallery/887280#8 - to jest bardzo realistyczne, twarz ze zdjęcia :) ?
Strony: [1] 2 3 4 5 ... 10