Войти
ПрограммированиеФорумГрафика

Конвертирование текстурных PBR-карт

Страницы: 1 2 3 4 Следующая »
#0
(Правка: 7:27) 4:31, 4 окт. 2019

По этой теме имеется два вопроса:
1) Как корректно конвертировать текстуры specular / glossiness в metall / roughness (желательно GLSL)?
2) Как при получении нормалей из карты высот корректно вычислить координату Z? Сколько видел примеров, вычисляются только координаты XY, хотя в 3D-редакторах координата Z запекается корректно и в Фотошопе она вычисляется корректно.


#1
9:46, 4 окт. 2019

2) может из условий нормировки? Z = sqrt(1 - (x*x + y*y))

#2
(Правка: 11:29) 11:28, 4 окт. 2019

1) metalness подразумевает, что цвет металл-спекуляра - в альбедо текстуре, а также что какие-то тексели либо 100% металл, либо совсем не металл (не знаю случаев где бы юзалось значение посередине). Обычно у диэлектриков (если по-пбрски) довольно низкий спекуляр, в районе 0.04, значит можно попробовать просто if'нуть яркость спекуляра так и получить металнесс. Далее всё что металл - содержимое спек тексы переносишь в альбедо.
Roughness это просто 1-glossiness, однако стоит иметь в виду, что разные движки и известные формулы юзают разную кривую его, где-то придётся ещё корень/квадрат от результата взять.

#3
(Правка: 13:40) 13:40, 4 окт. 2019

AMM1AK
> может из условий нормировки? Z = sqrt(1 - (x*x + y*y))
Ну вроде всё нормально работает :) если кому-то будет нужно, вот код шейдера конвертирования Height Map в Normals:

+ GLSL

Mr F
На мой взгляд все текстуры должны быть стандартны, так как распространяются без учёта типа реализации PBR, но я использую вот этот.

#4
15:31, 4 окт. 2019

Daniil Petrov
> 1) Как корректно конвертировать текстуры specular / glossiness в metall /
> roughness (желательно GLSL)?

https://forum.substance3d.com/index.php?topic=24601.0

#5
16:34, 4 окт. 2019

endeavour_pr
Это мне всё попадалось, а мне нужен алгоритм...

#6
16:39, 4 окт. 2019

Daniil Petrov
> Это мне всё попадалось, а мне нужен алгоритм...
Лол ... там же вроде пишут что нельзя алгоритмом

в анриле как-то делают мутно я сам нихера не понимаю и вроде оно не выглядит норм после

#7
16:53, 4 окт. 2019

endeavour_pr
Жаль, очень жаль! А хотелось бы, так как в интернете полно халявных текстур именно под этот вид PBR...

#8
17:21, 4 окт. 2019

https://github.com/KhronosGroup/glTF-Sample-Viewer/blob/master/sr… oughness.frag

#ifdef MATERIAL_SPECULARGLOSSINESS

#ifdef HAS_SPECULAR_GLOSSINESS_MAP
    vec4 sgSample = SRGBtoLINEAR(texture2D(u_SpecularGlossinessSampler, getSpecularGlossinessUV()));
    perceptualRoughness = (1.0 - sgSample.a * u_GlossinessFactor); // glossiness to roughness
    f0 = sgSample.rgb * u_SpecularFactor; // specular
#else
    f0 = u_SpecularFactor;
    perceptualRoughness = 1.0 - u_GlossinessFactor;
#endif // ! HAS_SPECULAR_GLOSSINESS_MAP

#ifdef HAS_DIFFUSE_MAP
    baseColor = SRGBtoLINEAR(texture2D(u_DiffuseSampler, getDiffuseUV())) * u_DiffuseFactor;
#else
    baseColor = u_DiffuseFactor;
#endif // !HAS_DIFFUSE_MAP

    baseColor *= getVertexColor();

    // f0 = specular
    specularColor = f0;
    float oneMinusSpecularStrength = 1.0 - max(max(f0.r, f0.g), f0.b);
    diffuseColor = baseColor.rgb * oneMinusSpecularStrength;

#ifdef DEBUG_METALLIC
    // do conversion between metallic M-R and S-G metallic
    metallic = solveMetallic(baseColor.rgb, specularColor, oneMinusSpecularStrength);
#endif // ! DEBUG_METALLIC

#endif // ! MATERIAL_SPECULARGLOSSINESS

#ifdef MATERIAL_METALLICROUGHNESS

#ifdef HAS_METALLIC_ROUGHNESS_MAP
    // Roughness is stored in the 'g' channel, metallic is stored in the 'b' channel.
    // This layout intentionally reserves the 'r' channel for (optional) occlusion map data
    vec4 mrSample = texture2D(u_MetallicRoughnessSampler, getMetallicRoughnessUV());
    perceptualRoughness = mrSample.g * u_RoughnessFactor;
    metallic = mrSample.b * u_MetallicFactor;
#else
    metallic = u_MetallicFactor;
    perceptualRoughness = u_RoughnessFactor;
#endif

    // The albedo may be defined from a base texture or a flat color
#ifdef HAS_BASE_COLOR_MAP
    baseColor = SRGBtoLINEAR(texture2D(u_BaseColorSampler, getBaseColorUV())) * u_BaseColorFactor;
#else
    baseColor = u_BaseColorFactor;
#endif

    baseColor *= getVertexColor();

    diffuseColor = baseColor.rgb * (vec3(1.0) - f0) * (1.0 - metallic);

    specularColor = mix(f0, baseColor.rgb, metallic);

#endif // ! MATERIAL_METALLICROUGHNESS
#9
17:32, 4 окт. 2019

Daniil Petrov
ну раз есть значит какие-то движки  его используют

#10
19:28, 4 окт. 2019

Daniil Petrov
> в интернете полно халявных текстур
таки имей в виду, что они совсем не обязаны быть все с одинаковым форматом глосса, какой ты ожидаешь. одни могут быть под анрил, другие под юнити, третьи под мармосет, BRDF'ы отличаются и сама кривая данных тоже. надо сравнивать со скринчиками.

#11
19:38, 4 окт. 2019

Mr F
> мей в виду, что они совсем не обязан
Ну например вот первое попавшееся, как такое в анрил правильно сделать  ?
https://www.turbosquid.com/FullPreview/Index.cfm/ID/1223290

Mr F
> BRDF'ы отличаются и сама кривая данных тоже. надо сравнивать со скринчиками.

Как ?  туторы ?
Например перенос с юнити на анрил

#12
19:39, 4 окт. 2019

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

#13
20:22, 4 окт. 2019

vindast
> Давно прошли тот момент когда память нужно было экономить на столько жетско.
Тут экономят не объем памяти, а её пропускную способность

#14
20:29, 4 окт. 2019

MrShoor
> Тут экономят не объем памяти, а её пропускную способность

вынимать 5 значений из карты высот чтобы подсчитать нормаль это НЕ зависит от пропускной способности ?

напомни, в чём поинт 3DC? вдруг не знаешь?

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика