Jak zrobić żeby kwadraty zwiększały swoją ilość w wzór "kolisty"

0

Chciałbym żeby podczas zwiększania instancecount w glDrawArrayInstanced kwadraty pojawiały się w około pierwszego, tzn. z taki kolisty wzór, zamiast po prostu leciały w od pierwszego w jedną stronę, tutaj pokazuje o co chodzi. Na filmiku kwadraty dodają się w górę i w prawo, a ja chciałbym żeby dodawały się jeszcze w "drugą" górę i lewo.

Próbowałem to zrobić w ten sposób, że po prostu gdy dodaje następne kwadraty, przesuwam wszystkie o ich ilość * rozmiar jednego kwadratu, ale albo były one przesuwane źle, tzn. gdzieś daleko poza kamerę uciekały, albo wychodziły dziwne kształty (te dziwne kształty to wychodziły jak próbowałem dziwnych dodawań, mnożeń, odejmowań, więc się nie dziwie :D, ale ważne, że coś próbowałem zdziałać).

Pseudo kod:

struct Instances
{
    int instanceX = 10;
    int instanceY = 10;
};
Instances instance;
void Draw()
{
    UploadInstancesUniforms(&instance);
    BindUniforms();
    glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, instance.instanceX * instance.instanceY);
}

shader:

#version 460 core

layout(location = 0) out vec2 v_uv;

layout(std140, binding = 0) uniform Camera
{
    mat4 mvp_matrix;
    mat4 mv_matrix;
    mat4 proj_matrix;
};

layout(std140, binding = 1) uniform Instances
{
    int instanceX;
    int instanceY;
};

void main()
{
    const vec4 vertices[] = vec4[](vec4(-0.5, 0.0, -0.5, 1.0),
                                   vec4( 0.5, 0.0, -0.5, 1.0),
                                   vec4(-0.5, 0.0,  0.5, 1.0),
                                   vec4( 0.5, 0.0,  0.5, 1.0));

    int x = gl_InstanceIndex / instanceX;
    int y = gl_InstanceIndex % instanceY;

    gl_Position = mvp_matrix * (vertices[gl_VertexIndex] + vec4(float(x), 0.0, float(y), 0.0));
}

W jaki sposób zmodyfikować ten shader żeby kwadraty dodawały się po każdej stronie?

2
HowToMake napisał(a):

Próbowałem to zrobić w ten sposób, że po prostu gdy dodaje następne kwadraty, przesuwam wszystkie o ich ilość * rozmiar jednego kwadratu, ale albo były one przesuwane źle

No to „coś źle robiłeś”. Weź pod uwagę że przy dodawaniu jednej warstwy kwadratów po prawej, całość trzeba przesunąć o pół kwadratu w lewo (by wszystko nadal pozostało wycentrowane).

Zatem przy rozmiarze "6" całość powinna być przesunięta o 3 kwadraty względem zamierzonego środka.

1

Weź gdzieś zapisz w uniformie szerokość i wysokość w kafelkach. Tego ci brakuje. Przynajmniej tego nie widzę.

A licząc współrzędne, musisz po prostu odjąć w shaderze połowę rozmiaru planszy oraz jeszcze dodatkowo pół kafelka odjąć (zakładając, że kafelek rozciąga się od -0.5 do 0.5)

czyli (w pseudokodzie)

pozycja.x = (pozycja_kafelka.x - liczba kafelków w poziomie / 2- 0.5) * rozmiar kafelka
pozycja.y = (pozycja_kafelka.y - liczba kafelków w pionie / 2 - 0.5) * rozmiar kafelka

gdzie pozycja kafelka to pozycja na planszy (w którym rzędzie i kolumnie jest kafelek, czyli to co masz pod int x i int y)

coś podobnego zrobiłem kiedyś w Three.js:
https://github.com/hex13/tileterrain/blob/master/src/createTerrain.js#L53
Tylko, że nie widzę, żebym odejmował 0.5 kafelka.
No i ustawiałem współrzędne wierzchołków na poziomie CPU, a nie w shaderze

1 użytkowników online, w tym zalogowanych: 0, gości: 1