Vitaro

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

19 posts in this topic

 

В данном гайде речь пойдет о таком важном файле как *.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

Share this post


Link to post
Share on other sites
В 17.02.2017 в 11:04, Vitaro сказал:

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

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

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites
В ‎17‎.‎02‎.‎2017 в 10:04, Vitaro сказал:

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


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

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

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

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

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

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

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

0

Share this post


Link to post
Share on other sites

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

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

0

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

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

Edited by diver13
0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

Edited by diver13
0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

Edited by diver13
0

Share this post


Link to post
Share on other sites

@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

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

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

Edited by diver13
0

Share this post


Link to post
Share on other sites

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

1

Share this post


Link to post
Share on other sites

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

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

Edited by diver13
0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

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

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

Edited by diver13
0

Share this post


Link to post
Share on other sites

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

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.