Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Irrlicht] Blending Tekstur

Ostatnio zmodyfikowano 2024-02-19 21:14
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[Irrlicht] Blending Tekstur
» 2024-02-19 18:43:08
Witam.
Czy w Irrlicht jest możliwe łączenie tekstur ? To znaczy mam dwie tekstury i chciałbym je połączyć w jedną na zasadzie średniej sumy kolorów czyli:

 textura.kolor = (textura1.kolor + textura2.kolor)/2.0f;
P-180833
DejaVu
» 2024-02-19 19:09:04
Takie liczenie 'średniej' z kolorów tekstur stycznych źle będzie wyglądało.
P-180834
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-19 19:11:24
Potrzebuję stworzyć teksturę która będzie się znajdowała pomiędzy polami "grass" i "sands"

https://catlikecoding.com/unity/tutorials/hex-map/part-2/
https://catlikecoding.com/unity/tutorials/hex-map/part-14/
P-180835
DejaVu
» 2024-02-19 19:13:27
Weź sobie GIMP-a, narysuj obok siebie te dwie tekstury, a jedna z nich niech nachodzi na drugą (1px), a następnie ten pasek 1px przejedź gumką z przezroczystością 50%. Zobaczysz, że to wygląda źle. Keep it simple.

/edit:
Poza tym celuj w MVP jeżeli faktycznie chcesz coś wypuścić. Jeżeli chcesz poświęcić energię na robienie efektu łączenia sąsiadujących pól mapy zamiast robić właściwą grę, to możesz zarówno zwiększyć poziom skomplikowania kodu, jak również oddalić się od Twojego celu tj. zrobienia działającej gry.

Jak będziesz miał działającą grę, to potem równie dobrze możesz wygenerować sobie obrazki, które mają przejście między trawą, a pustynią, które zajmują całe pole lub tylko modyfikują jedną krawędź. Nie ma sensu przedwcześnie komplikować sobie projektu.
P-180836
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-19 19:19:23
Ok. Na razie to tworzę edytor Map.
P-180837
DejaVu
» 2024-02-19 19:24:19
Jeszcze hinty od ChatGPT:
Łączenie dwóch stykających się tekstur, tak aby krawędź łączenia (na przykład między terenem "trawy" a "pustyni") wyglądała naturalnie i płynnie, to typowe zadanie podczas tworzenia gier lub symulacji terenu. W Irrlicht Engine, takie efekty można osiągnąć na kilka sposobów, w zależności od potrzeb i złożoności sceny. Oto dwa podejścia, które mogą być stosowane:

1. Użycie Splattingu Tekstur (Texture Splatting)
"Splatting" tekstur to technika często używana do tworzenia płynnych przejść między różnymi typami terenu. Polega na nałożeniu wielu tekstur na powierzchnię terenu, gdzie każda tekstura ma swoją własną mapę alfa określającą, gdzie i jak intensywnie jest widoczna. W przypadku Irrlicht, możesz to zrobić używając shaderów.

Przykład:
Wierzchołki terenu mają przypisane różne współczynniki dla różnych tekstur (na przykład trawa, piasek), które są mieszane na podstawie tych współczynników.
Shader jest używany do dynamicznego mieszania tekstur na podstawie map alfa lub innych kryteriów (wysokość, nachylenie itp.).
2. Mieszanie Tekstur w Shaderach
Jeśli chcesz mieć pełną kontrolę nad procesem mieszania i wykorzystać potęgę GPU, najlepiej jest napisać własny shader do mieszania tekstur.

Przykład:
Vertex Shader może przekazywać współrzędne tekstur i inne atrybuty do Fragment Shadera.
Fragment Shader może wykonywać logikę mieszania, na przykład używając wartości przekazanych z Vertex Shadera do interpolacji między teksturami trawy i pustyni na podstawie lokalizacji fragmentu (piksela).
Oto prosty przykład, jak mogłaby wyglądać taka logika mieszania w pseudokodzie GLSL dla shadera:


// Vertex shader
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoords;

out vec2 TexCoords;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    TexCoords = aTexCoords;
    gl_Position = projection * view * model * vec4(aPos, 1.0);
}

// Fragment shader
#version 330 core
out vec4 FragColor;

in vec2 TexCoords;

uniform sampler2D grassTexture;
uniform sampler2D sandTexture;
uniform float blendFactor; // Wartość określająca jak mocno mieszane są tekstury

void main()
{
    vec4 grassColor = texture(grassTexture, TexCoords);
    vec4 sandColor = texture(sandTexture, TexCoords);
    vec4 finalColor = mix(grassColor, sandColor, blendFactor);
    FragColor = finalColor;
}
W powyższym przykładzie blendFactor mógłby być ustalony na podstawie różnych kryteriów, na przykład odległości od pewnego punktu na terenie, co pozwala na płynne przejście między trawą a piaskiem.

Implementacja w Irrlicht
Dokładna implementacja shaderów w Irrlicht będzie wymagać użycia IGPUProgrammingServices do dodania własnych shaderów do materiału. Będziesz musiał zarejestrować callback, który pozwoli Ci na ustawienie uniformów shadera w zależności od logiki twojej gry.

Pamiętaj, że praca ze shaderami wymaga pewnej znajomości GLSL (lub HLSL, jeśli używasz DirectX w Irrlicht) oraz zrozumienia, jak Irrlicht zarządza materiałami i shaderami. Jeśli jesteś nowy w pracy z shaderami, zacznij od prostych przykładów i stopniowo dodawaj więcej logiki mieszania i efektów.

Możesz w sumie rozważyć renderowanie 'kolejnej' tekstury na krawędziach stycznych, która 'nałoży' dodatkowy efekt przejścia między różnymi terenami. Niemniej jednak to nie jest MVP i komplikuje projekt.
P-180838
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-19 21:14:13
Czyli tworzyć minimalistyczny projekt, a dopiero później go rozbudowywać. Ok postaram się w ten sposób budować aplikację.
P-180841
« 1 »
  Strona 1 z 1