Skocz do zawartości

texture_set_interpolation


Ice Cube
Przejdź do rozwiązania Rozwiązane przez Konrad-GM,

Rekomendowane odpowiedzi

Cześć

załączyłem w mojej grze taką fajną opcje by poznikały pixele

texture_set_interpolation(true)

 

i nad niektórymi obiektami pojawiły mi sie kreski takie jak na załączonym obrazku ;/

gdy wchodze w edycje textury nic tam nie ma,a w grze jednak po zalączeniu tej opcji sie pojawia ta kreska.

 

i druga sprawa do czego służy texture_set_blending ?

nie wiem co to blender -sory :D

 

 

 skrzynia.png.52104e339053d30fee9f022443fcc0ba.png

 

Odnośnik do komentarza
Udostępnij na innych stronach

11 minut temu, I am Lord napisał:

A zrób tą texturę o jeden pixel wyższą i wtedy przenieś o jeden w górę cały obrazek tak by dolne pixele nie dotykały krawędzi obrazka

 

no dobra to działa :) ,kreska zniknęła

 

pozostaje jeszcze kwestia podłogi,która sie składa z 4 textur leżących obok siebie i tworzących kwadrat,na połączeniach powstały też takie jakby kreski

screenshot100.png

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Zaznaczyłeś "use as 3d texture"? W gms2 chyba można było zaznaczyć, żeby na atlasie się po 1 pikselu wrapowaly obrazki na krawędziach aby z tym walczyć, nie wiem czy w jedynce też. Ten pasek to jest rozmyta sąsiadującą grafika.

Odnośnik do komentarza
Udostępnij na innych stronach

4 godziny temu, gnysek napisał:

Zaznaczyłeś "use as 3d texture"? W gms2 chyba można było zaznaczyć, żeby na atlasie się po 1 pikselu wrapowaly obrazki na krawędziach aby z tym walczyć, nie wiem czy w jedynce też. Ten pasek to jest rozmyta sąsiadującą grafika.

LOL Używam gm 8.0 :P (już niedługo zmienie)

próbowałem wygumować 1 pixel dookoła textur.efekt-jeszcze bardziej widoczne linie ;/

Odnośnik do komentarza
Udostępnij na innych stronach

46 minut temu, I am Lord napisał:

A zobacz czy oprócz włączenia iterpolacji, włączenie jeszcze texture_set_repeat(true) cos zmienia

 

a i wyłącz też "smooth edges" w ustawieniach sprita czy tam backgorunda

tylko takie opcje są dostępne w sprite i background

 

blalbalbal.png

Odnośnik do komentarza
Udostępnij na innych stronach

1 minutę temu, I am Lord napisał:

A bo ty nie masz włączonego advanced mode, to sobie włącz gdzieś w opcjach czy pod Files to było. Już nie pamiętam

no właśnie mam włączone advanced ,i są takie opcje jak powyżej na zdięciu.

texture_set_repeat(true) też nie daje żadnego efektu ;/

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Dokładnie, jak używasz programu który ma 9 lat, to się nie dziw, że są problemy. W ogóle działają gry z niego na nowych Windowsach? Przypominam, że już od pół roku wsparcia nie ma nawet GM Studio 1.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Rozwiązanie

Cześć, problem z interpolacją tekstur jest jak najbardziej "normalną" odpowiedzią od karty graficznej, generalnie ten problem występuje od zawsze, odkąd istnieje interpolacja sampli. Jednym z rozwiązań jest wyłączenie powtarzalności tekstur np. w OpenGL jest to ustawienie w teksturze flagi GL_TEXTURE_WRAP_S/T na GL_CLAMP_TO_EDGE, jednak GameMaker nie udostępnia takowych funkcji ;) 

 

Przykładowe ustawienia wrap-owania tekstur w OpenGL (opcje te występują również w DirectX);

c3_clamping.png

 

W Twoim przypadku GameMaker prawdopodobnie ustawia teksturom odpowiednik GL_REPEAT w DirectX, dlatego pojawiają Ci się te "artefakty" na krańcach tekstury. 

 

Dodatkowo każda tekstura musiałaby być "stworzona" jako oddzielna tekstura w VRAM, atlas tekstur nie zadziała, jak to się dzieje w przypadku GMS1.4+ (tzw. grupy obrazków w ustawieniach GMa, ale da się to akurat ominąć).
 

Więc w skrócie problem polega na tym, że interpolacja sampli w fragment shaderze miesza sąsiadujące kolory, tworząc tzw. texel, jak się pewnie domyślasz, artefakty które pojawiają Ci się na krańcach modelu podłogi to po prostu zmieszane kolory z drugiego krańca tekstury, dlatego też warto czasami używać tekstur seamless ;) Po więcej teorii dot. tekstur i metod samplowania odsyłam do https://cglearn.eu/pub/computer-graphics/textures-and-sampling

 

Jako, że nie możemy wyłączyć powtarzalności tekstur, można za to wykluczyć krańce tekstury z samplowania, efekt nie jest idealny, ale nie ma tak oczojebnych artefaktów. Przykład poniżej:


P63NYqz.png e2tzEwc.png

 

Jednak aby wykluczyć krańce tekstury w GMie, trzeba stworzyć własny model podłogi, bo draw_floor nie udostępnia funkcji do modyfikacji UV per vertex, ani GameMaker 8.0 nie wspiera shaderów.

Kod obj_floor w Create Event u mnie wygląda tak:

// tworzymy model podlogi tylko raz i przypisujemy model do zmiennej globalnej
if (!variable_global_exists("model_floor")) {
    
    // obliczamy polowe texela tekstury do wykluczenia go z sampla
    // teraz kazdy kafelek Twojej podlogi musi miec taka sama wielkosc
    var u, v;
    u = (1.0 / background_get_width(texTile)) * 0.5;
    v = (1.0 / background_get_height(texTile)) * 0.5;

    // szerokosc i dlugosc podlogi
    var w, h;
    w = 64;
    h = 64;
    
    // tworzymy model podlogi (tylko raz)
    global.model_floor = d3d_model_create()
    d3d_model_primitive_begin(global.model_floor, pr_trianglefan);
    d3d_model_vertex_texture(global.model_floor, 0, 0, 0, 0.0 + u, 0.0 + v);
    d3d_model_vertex_texture(global.model_floor, w, 0, 0, 1.0 - u, 0.0 + v);
    d3d_model_vertex_texture(global.model_floor, w, h, 0, 1.0 - u, 1.0 - v);
    d3d_model_vertex_texture(global.model_floor, 0, h, 0, 0.0 + u, 1.0 - v);
    d3d_model_primitive_end(global.model_floor);
}

// tekstura podlogi
texid = background_get_texture(texTile);

 

Natomiast obj_floor i Draw Event:

d3d_model_draw(global.model_floor, x, y, 0, texid);

 

Można też poprawić wygląd łączeń, ale tutaj jest trochę więcej roboty - musiałbyś zeskalować tekstury powiedzmy z 2048 do 2046 na środek i te wolne piksele na krańcach przekopiować z sąsiadujących ze sobą tekstur (tekstura nadal musi mieć 2048px).

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

ja chyba to tak rozwiązywałem, że dawałem pozycje rysowania tekstur od 0.01 do 0.99 z tego co pamiętam. Ale zabawa z 3D w GameMakerze, to jak wożenie lodówki maluchem, albo jazda na sankach latem po trawniku. Generalnie średnio wychodzi :D

Odnośnik do komentarza
Udostępnij na innych stronach

58 minut temu, gnysek napisał:

ja chyba to tak rozwiązywałem, że dawałem pozycje rysowania tekstur od 0.01 do 0.99 z tego co pamiętam. Ale zabawa z 3D w GameMakerze, to jak wożenie lodówki maluchem, albo jazda na sankach latem po trawniku. Generalnie średnio wychodzi :D

 

Ważne, że działało i dawało zadowalające efekty, tyle, że to takie mini-piekło dla perfekcjonisty :P Jednak ten problem z interpolacją dotyczy każdego silnika czy biblioteki graficznej, brak shaderów czy chociaż podstawowych ustawień tekstur to już rzeźnia po prostu. Ale warto wiedzieć jak sobie radzić z takimi problemami gdy ogranicza narzędzie :D 

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli co zamiast pełnego zakresu UV mapy, trzeba zabrać z niej z każdego krańca po połowie pixela?

A wyłączenie texture_repeat nie dawało nic? Ewentualnie można tak narysować textury by te miały na krawędziach takie same pixele po jednej i drugiej stronie.

Odnośnik do komentarza
Udostępnij na innych stronach

7 godzin temu, I am Lord napisał:

Czyli co zamiast pełnego zakresu UV mapy, trzeba zabrać z niej z każdego krańca po połowie pixela?

A wyłączenie texture_repeat nie dawało nic? Ewentualnie można tak narysować textury by te miały na krawędziach takie same pixele po jednej i drugiej stronie.

 

Bezszwowe tekstury to normalna praktyka by się pozbyć tego efektu, ale czasami to nie wystarcza, zwłaszcza jak się podzieli teksturę na mniejsze elementy, bo po prostu limit rozmiaru tekstury nie pozwala na to. Efekt co prawda nie jest idealny, ale można i z tym powalczyć, np. przekopiowując krańce tekstury z tekstury sąsiadującej. Coś na zasadzie dodawania 1px obramowania do sprite'ów w atlasie tekstur, żeby też ominąć te brzydkie łączenia z sąsiednim spritem. (w 3D tekstura musi być rozmiaru potęgi dwójki, dlatego np. 2050px odpada i trzeba obraz skalować)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...