Vitaro

transport fever
[Гайд] MTL и текстуры

19 сообщений в этой теме

 

В данном гайде речь пойдет о таком важном файле как *.mtl и немного о текстурах

Mtl - файл настройки текстур. В нем прописано в какой роли они будут использоваться и как обрабатываться.
Прежде всего стоит ознакомится с данными материалами. Там указано как нужно конвертировать сами текстуры. Игра понимает только два формата: TGA и DDS.
У обоих форматов есть свои преимущества, но по факту лучше использовать dds.
Плюсы и минусы разных форматов (все это из личных наблюдений и все очень субъективно):
TGA:
+ легкость редактирования, чуть более лучшее качество по сравнению с dds;
- размер файлов. если будут использоваться множество текстур, размер мода может значительно вырасти в объемах. Как на таковой производительности это ни как не сказывается. Игра сама производит компрессию текстур, единожды, пока не увидит изменений. Разница только в скорости загрузки игры.
DDS:
+ размер файлов
- очень капризен при конвертировании (нужно быть внимательным при конвертации). Во время перевода в dds, не значительно падает качество изображения в игре.

Самое важное с текстурами - должна соблюдаться кратность размеров.
для основных текстур и нормалей кратность должна быть равна 8
для карты окрасок и металл-глоса кратность должна быть равна 4
размер 700х704 будет работать не корректно (700 / 8 = 87.5)
704х704 будут работать правильно ( 704 / 8  =  88)
На картах от NVidea это ни как не проявляется, а вот от ATI текстуры просто могут не отрисоваться и будут фиолетовыми.

-------------------------------

И так перейдем к mtl. Прежде всего стоит определиться какие шейдеры вы будете использовать. Обычно пишутся снизу и имеют формат:

type = "PHYSICAL_NRML_MAP",

Есть несколько разных типов:
PHYSICAL (PHYS) - используется чаще всего. Его можно увидеть на всем подвижном транспорте.
PHYS используется на транспорте, в котором нужно нарисовать стекла, об этом ниже. Он не просвечивается сквозь воду. Основная текстура пишется как:

map_albedo_opacity

PHYSICAL просвечивает сквозь воду, но стекла к нему добавить нельзя. Тут текстура прописывается как:

map_albedo

Единственный шейдер, который может работать с расширением dds.

REFLECTIVE - чаще всего используется на статичных объектах, которым не нужно рисовать металлический отблекс. Работает к картой нормалей. Также можно прописать карту грязи. Основная текстура имеет команду: 

map_color_reflect

Не понимает dds формат, только tga.
Можно прописать карту грязи кодом:

map_env = {
	compressionAllowed = true,
	fileName = "c.tga",
	magFilter = "LINEAR",
	minFilter = "LINEAR",
	mipmapAlphaScale = 0,
	type = "CUBE_MAP",
	wrapS = "REPEAT",
	wrapT = "REPEAT",
}

О том что тут все означает я напишу ниже.

TRANSPARENT шейдер прозрачности, используется как отдельно, так и с шейдером PHYS.
работает только с одной текстурой, которая прописывается как:

map_color_alpha

Используется в игре для знаков миссий (восклицательный и вопросительный знаки), а также для деревьев и травы (полупрозрачные листья).

EMISSIVE  шейдер создающий светящиеся объекты, к примеру фонари
текстура пишется:

map_emissive

Свечение также можно создать и с шейдером "TRANSPARENT"

-------------------------

Теперь перейдем к командам, которые можно прописать шейдерам.
команды приписываются подобным образом:
REFLECTIVE_NRML_MAP
Где "REFLECTIVE" название шейдера, "_NRML_MAP" подключение карты нормалей.

Список команд:
"_NRML_MAP" подключение карты нормалей. Работает с "REFLECTIVE", "TRANSPARENT", "PHYSICAL" и "PHYS"
"_CBLEND_DIRT" подключение карты грязи и карты перекраски. Работает с "PHYSICAL" и "PHYS"
"_TRANSPARENT" - подключает прозрачность на стеклах. Работает только с "PHYS" или самостоятельно.
"_OP" - нанесение на объект не контролируемой карты грязи. Работает с "REFLECTIVE", "TRANSPARENT" и "PHYSICAL"
"_ALPHA" - подключение прозрачности. К сожалению про эту команду мало что могу сказать, мы её ещё не изучали. Со временем может я дополню гайд. При подключении, команду текстуры нужно писать уже "map_albedo_alpha" для "PHYSICAL". Команду встречал только с этим шейдером, про совместимость с другими ничего написать не могу.

----------------------

Далее рассмотрим сам состав mtl, что там можно прописать.
 

map_albedo = {								-- Тип обрабатываемой текстуры
	compressionAllowed = true,					-- Разрешить игре сжатие текстур
	fileName = "models/asset/ground/tipi_001_albedo_opacity.dds",	-- Путь к файлу текстуры
	magFilter = "LINEAR",
	minFilter = "LINEAR_MIPMAP_LINEAR",
	mipmapAlphaScale = 0,				-- Жесткость альфы, работает только с командой "_ALPHA"
	type = "TWOD",
	wrapS = "CLAMP_TO_EDGE",			-- Зациклить текстуру (REPEAT) или использовать один раз для оси Х
	wrapT = "CLAMP_TO_EDGE",			-- Зациклить текстуру (REPEAT) или использовать один раз для оси У
}

Какие есть типы текстур:
map_albedo - основной файл текстуры для шейдера "PHYSICAL"
map_emissive - основной файл текстуры для "EMISSIVE"
map_color_alpha - основной файл текстуры для "TRANSPARENT"
map_color_reflect - основной файл текстуры для "REFLECTIVE"
map_albedo_opacity - основной файл текстуры для "PHYS"
map_metal_gloss_ao - карта металлического блеска, отражения стекла и амбиента, работает только с шейдарами "PHYSICAL", "PHYS"
map_normal - карта нормалей. Команда включения "_NRML_MAP"
map_cblend_dirt_rust - подключение карты перекраски, грязи и ржавчины. Включается командой "_CBLEND_DIRT"
map_env - работает только с "REFLECTIVE", команды для включения писать не нужно. Можно использовать штатную текстуру:

 

map_env = {
	compressionAllowed = true,
	fileName = "c.tga",
	magFilter = "LINEAR",
	minFilter = "LINEAR",
	mipmapAlphaScale = 0,
	type = "CUBE_MAP",
	wrapS = "REPEAT",
	wrapT = "REPEAT",
}

 

map_op_1, operation_1, map_op_2, operation_2 - карта не контролируемой грязи и нормалей, подключаемая командой "_OP". Пишется все вместе, но можно разделить по индексу операций. Пример кода:

 

map_op_1 = {
	compressionAllowed = true,
	fileName = "models/industry/overlay_textures/small_01.tga",		-- Путь к штатной текстуре
	magFilter = "LINEAR",
	minFilter = "LINEAR_MIPMAP_LINEAR",
	mipmapAlphaScale = 0,
	type = "TWOD",
	wrapS = "REPEAT",	-- Способ заливки зацикливание или разово (CLAMP_TO_EDGE) для данного типа лучше использовать повтор
	wrapT = "REPEAT",	-- аналогично, но для другой оси
},
operation_1 = {
	op = "OVERLAY",		
	mode = "NORMAL",
	scale = { 1.0/8, 1.0/8 },	-- Контраст текстуры
	opacity = 0.6				-- Прозрачность
},
map_op_2 = {
	compressionAllowed = true,
	fileName = "models/industry/overlay_textures/big_01.tga",
	magFilter = "LINEAR",
	minFilter = "LINEAR_MIPMAP_LINEAR",
	mipmapAlphaScale = 0,
	type = "TWOD",
	wrapS = "REPEAT",
	wrapT = "REPEAT",
},
operation_2 = {
	op = "OVERLAY",
	mode = "NORMAL",
	scale = { 1.0/10, 1.0/10 },
	opacity = 0.4
}

 

А теперь я приведу весь файл mtl для Каскадии и в нем распишу, что за что отвечает

 

function data()
return {
	params = {
		color_blend = {								-- Работает если прописана команда "_CBLEND".
			albedoScale = math.pow(1.37, 1.5),		-- Жесткоть цветов, которые выбирает игрок.  Можно просто писать 1 и выше
		},
		dirt_rust = {								-- Работает если прописана команда "_CBLEND".
			dirtColor = { 70/255, 63/255, 55/255 }, -- Цвет грязи, работает если прописана команда "_CBLEND"
			dirtOpacity = 5/100,					-- Прозрачность грязи
			dirtScale = 100/12.5,					-- Жесткость цвета грязи
			rustColor = { 83/255, 69/255, 42/255 },	-- Цвет ржавчины
			rustOpacity = 50/100,					-- Прозрачность грязи
			rustScale = 100/34.77,					-- Жесткость цвета ржавчины
		},
		fade_out_range = {							-- Дальность отрисовки текстур, по факту я не увидел результтат работы команды
			fadeOutEndDist = 20000,					-- Конечная дистанция
			fadeOutStartDist = 10000,				-- Начальная
		},
		map_albedo_opacity = {						-- Команда для основной текстуры. отсюда видно что включен шейдер "PSYH"
			compressionAllowed = true,				-- Делать компресию или нет. Не актуально для dds формата
			fileName = "models/vehicle/truck/truck_frightliner_cascadia_2009_albedo_opacity.dds",	-- Путь текстуры
			magFilter = "LINEAR",
			minFilter = "LINEAR_MIPMAP_LINEAR",
			mipmapAlphaScale = 0,
			type = "TWOD",
			wrapS = "CLAMP_TO_EDGE",
			wrapT = "CLAMP_TO_EDGE",
		},
		map_cblend_dirt_rust = {			-- Подключение карты грязи, ржавчины и перекраски игроком
			compressionAllowed = true,
			fileName = "models/vehicle/truck/truck_frightliner_cascadia_2009_cblend_dirt_rust.dds",
			magFilter = "LINEAR",
			minFilter = "LINEAR_MIPMAP_LINEAR",
			mipmapAlphaScale = 0,
			type = "TWOD",
			wrapS = "CLAMP_TO_EDGE",
			wrapT = "CLAMP_TO_EDGE",
		},
		map_dirt = {				-- подключение карты для грязи, работает только с командой "_CBLEND"
			compressionAllowed = true,
			fileName = "models/vehicle/dirt_albedo.dds",	-- Можно использовать штатный текстуру
			magFilter = "LINEAR",
			minFilter = "LINEAR_MIPMAP_LINEAR",
			mipmapAlphaScale = 0,
			type = "TWOD",
			wrapS = "REPEAT",		-- Гряз, нормаль для грязи, Ржавчина, нормаль для Ржавчины лучше зацикливать. Иначе могут появиться полосы.
			wrapT = "REPEAT",
		},
		map_dirt_normal = {			-- подключение карты нормалей для грязи, работает только с командой "_CBLEND"
			compressionAllowed = true,
			fileName = "models/vehicle/dirt_normal.dds",
			magFilter = "LINEAR",
			minFilter = "LINEAR_MIPMAP_LINEAR",
			mipmapAlphaScale = 0,
			type = "TWOD",
			wrapS = "REPEAT",
			wrapT = "REPEAT",
		},
		map_metal_gloss_ao = {			-- подключение карты блеска металла, стекла, амбиента
			compressionAllowed = true,
			fileName = "models/vehicle/truck/truck_frightliner_cascadia_2009_metal_gloss_ao.dds",
			magFilter = "LINEAR",
			minFilter = "LINEAR_MIPMAP_LINEAR",
			mipmapAlphaScale = 0,
			type = "TWOD",
			wrapS = "CLAMP_TO_EDGE",
			wrapT = "CLAMP_TO_EDGE",
		},
		map_normal = {					-- Подключени карты нормалей. Включается командой "_NRML_MAP"
			compressionAllowed = true,
			fileName = "models/vehicle/truck/truck_frightliner_cascadia_2009_normal.dds",
			magFilter = "LINEAR",
			minFilter = "LINEAR_MIPMAP_LINEAR",
			mipmapAlphaScale = 0,
			type = "TWOD",
			wrapS = "CLAMP_TO_EDGE",
			wrapT = "CLAMP_TO_EDGE",
		},
		map_rust = {			-- Подключение карты ржавчины
			compressionAllowed = true,
			fileName = "models/vehicle/rust_albedo.dds",	-- также штатная текстура
			magFilter = "LINEAR",
			minFilter = "LINEAR_MIPMAP_LINEAR",
			mipmapAlphaScale = 0,
			type = "TWOD",
			wrapS = "REPEAT",
			wrapT = "REPEAT",
		},
		map_rust_normal = {			-- Нормаль для ржавчины
			compressionAllowed = true,
			fileName = "models/vehicle/rust_normal.dds",
			magFilter = "LINEAR",
			minFilter = "LINEAR_MIPMAP_LINEAR",
			mipmapAlphaScale = 0,
			type = "TWOD",
			wrapS = "REPEAT",
			wrapT = "REPEAT",
		},
		polygon_offset = {
			factor = 0,
			units = 0,
		},
		two_sided = {
			flipNormal = false,		-- Так и не нашел действие команды
			twoSided = false,		-- Если вы с одной стороны видите текстуру, а с другой нет, пишите "true"
		},
	},
	type = "PHYS_TRANSPARENT_NRML_MAP_CBLEND_DIRT",
}
end

 

 

также отдельно можно добавить команду:

props = {
	coeffs = {
		1, 1, 0.25, 20
	}
}

Играя изменением параметров, можно либо осветлить, либо затенить объект. А с шейдером "TRANSPARENT" светиться

------------

На данный момент это все, если узнаем что-то новое, то обязательно дополним гайд.

5

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 17.02.2017 в 11:04, Vitaro сказал:

scale = { 1.0/8, 1.0/8 }, -- Контраст текстуры

а в какую сторону меняется контрастность?

1.0/8 и 1.0/128 что более контрастно? хотя не очень понятно почему контраст, когда scale - это масштаб.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну там не совсем контраст, больше резкость. На ржавчине в моделвьювере хорошо видно

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В ‎17‎.‎02‎.‎2017 в 10:04, Vitaro сказал:

также отдельно можно добавить команду:


props = {
	coeffs = {
		1, 1, 0.25, 20
	}
}

Играя изменением параметров, можно либо осветлить, либо затенить объект.

А можно для нубов разжевать, какая цифра за что отвечает?

Проблема такая: Имеется паровоз из TF (красивый цуко...), который в игре выглядит значительно темнее, чем на рендерах автора, и чем его текстура в редакторе.

Кроме вышеуказанных параметров, не нашел больше ничего, что можно было бы "подкрутить", а осветлять саму текстуру - не комильфо...

Заметил, что параметры эти стандартные для других модов из TF, но у большинства из них проблем с яркостью не замечается.

Извиняюсь, если не совсем по теме... :(

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@gam0ver lля осветления это не совсем корректный способ, параметры скорее отвечают за "свечение" объектов. Поиграйтесь в Модельвьювере.

А так они как-то работают по осям, толком я не смог разобраться

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так-с, для нубов)
Собственно вопрос по свету. С текстурами более-менее разобраться не трудно, цвет поменять смогу или закрасить что-то :D

Но вот со светом беда. так и не въехал. Есть допустим ТЭП60. У него в текстурах есть файлик tep60_light.hdr и в мтл валяется файл tep60_lights.mtl

Собственно как баран на новые ворота пялюсь на текстурку и этот мтл. Как он привязан конкретно к самой модели? Вернее как игра понимает в какой точке применять этот свет и какую часть текстурки в конкретной точке.

Вопрос возник-захотелось свет к М62 прикрутить и 2ТЭ25 с 2ТЭ116 по-возможности(2 разных секции, не намудрить-бы чего чтоб обе не заветились)) Но торможу люто.

 

Небольшой гайд если будет по свету-буду благодарен :huh:

Просто хотелось-бы закончить рихтовку моделей и выложить подправленные(с осями наконец нашел время, разобрался : теперь у М62, ТЭП70, 2ТЭ25 все колесные пары соосны буксам, остался свет)

Изменено пользователем diver13
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

hdr это обычная текстура. Свет на поезде тоже обычная 3д моделька.
В msh ссылка на mtl, в mtl ссылка на hdr. Вот как Модельке размечена UV сетка, так она и будет браться из файла hdr. И да, там можно добавлять текстуру, тогда свет будет немного изменяться.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Т.е. надо не просто отредактировать текстуры, а еще лезть менять саму модель лока? :wacko:

Изменено пользователем diver13
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет, свет идет отдельной моделькой. Просто плоский кружочек или квадрат.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Т.е. метода сделать в рамках обычной модели нет, обязательно надо этот элемент смоделировать, затекстурировать и приклеить к готовой модели?

Изменено пользователем diver13
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@diver13 а собственно зачем? Возьмете базовый msh, и просто в mtl для него пропишите другой путь до текстуры. Mtl и текстуру крутите как хотите. Самуже msh вы можете масштабировать как вам угодно.

Для трансформации можете использовать этот код:

transf = transf.scaleRotZYXTransl(vec3.new( 0.8, 0.8, 0.8 ), transf.degToRad(0, 0, 0), vec3.new(7.75, -9.2, -0.99))
					шкала по осям			поворот по осям		координаты расположения

 

в начале файла не забудьте прописать:

local vec3 = require "vec3"
local transf = require "transf"

 

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Немного торможу-т.е. можно прямо на "корпусе" указать место для света без доп моделек?
Или я неправильно понял и имелось ввиду взять от любой модели и прикрепить куда надо?

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@diver13 Откройте любой поезд со светом. Там прописывается его msh. Разработчики даже часто перед ним пишут "Lights" или его вариации. Просто меняйте положение и масштаб и смотрите сразу результат во вьювере. Я уже не знаю как подробнее расжевать.
Этот же msh копируйте себе и крутите как уже сами захотите.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

нет, этот файл я видел. меня именно смутило что свет это отдельная моделька. А соотвественно для лока у которого его нет это может вызвать определенные проблемы.
В общем шаги так понимаю простые:
скопировать весь этот набор файлов, имеющий в названии "lights"(ну на примере ТЭП60 это все с таким названием) в соотвествующие папки лока без фонарей(ну допустим тот-же М62) Далее переименовываю, перепрописываю пути в файлах, а дальше можно играться с размером и позиционированием и никаких особых подводных камней там не обнаружится.

вот суть вопроса. ;)

Изменено пользователем diver13
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@diver13 Да, эксперементируйте.  Собственно так потраха игры и изучал.

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Собственно это мне и было интересно) а то малоль там 3 фары просто треугольником с 3 "кружками" сделаны в модельке(ну у ТЭП60 3 фонаря) и тут никак к другому локу не приделаешь без 3Д редактора)

А тут оказывается все попроще)

Изменено пользователем diver13
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@diver13 всё так, но, если я правильно помню, у ТЭП60 как раз все 3 фонаря сделаны одной моделькой и на М62 они могут просто не поместиться на свои места.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Аааа, катастрофа :D ну в крайнем случае хотя-б от паровозов тогда главный прожектор скомунизжу, если с буферными все вцелом плохо окажется :ph34r:

Но учитывая открывшуюся информацию-значит можно одну такую "накладку" по модели клонировать сколько угодно раз? разрабы ограничений не наложили?

Изменено пользователем diver13
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@diver13 не наложили. Вы можете изменять размеры копируемого объекта. Как, я писал выше.

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу