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);
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:
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).