|
Xors3D Графический движок с поддержкой DirectX9 |
19.12.2014, 18:28
|
#1
|
Нуждающийся
Регистрация: 28.12.2010
Сообщений: 55
Написано одно полезное сообщение
|
Наложение нескольких текстур на загружаемый Mesh
Помогите пожалуйста. 3 дня мучаюсь над этим вопросом, уже все учебники, статьи и примеры пересмотрел - ни один из них не подходит.
:::::: КОД ::::::
;загружаем Mesh
mesh = xloadmesh("mesh.3ds")
;вызываем функцию текстурирования
mesh_texture_splatting()
Скажите суть метода, какие команды потребуется или может у кого-то алгоритм есть ))
Например нам дана вот такая маска и каждый цвет на ней ссответствует определенной текстуре.
->->->
|
(Offline)
|
|
19.12.2014, 18:36
|
#2
|
Нуждающийся
Регистрация: 28.12.2010
Сообщений: 55
Написано одно полезное сообщение
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Или нам даны maps и textures.
Где map (карта гор, карта_травы, карта_еще травы, карта_еще гор, карта нормалей)
А где textures( разные текстурки рисующие по белому цвету на maps)
+ ну еще в добавок можно текстуру Detail
|
(Offline)
|
|
19.12.2014, 18:57
|
#3
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Пиксельный шейдер в том состоянии в каком он сейчас в студию!
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
20.12.2014, 01:43
|
#4
|
ПроЭктировщик
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений (для 91 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Если тебе дать готовый шейдер, ты начнешь задавать много много вопросов.
Начни с малого: - изучи конвейер визуализации
- структуру написания шейдера
- "загрузку" текстур, каких то значений в шейдер
- пиксельный шейдер
- мультитекстурирование
static float4 Colorka : COLOR0;
texture diffuseTexture : TEXTURE_0;
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
MaxAnisotropy = 4;
};
struct PSInput
{
float2 texCoords : TEXCOORD0;
};
struct PSOutput
{
float4 color : COLOR;
};
PSOutput PSMain (PSInput input)
{
PSOutput output;
Colorka = float4(0,0.1,0,0);
output.color.rgba = tex2D(diffuseSampler, input.texCoords).rgba+Colorka;
return output;
}
technique MainTechnique
{
pass p
{
PixelShader = compile ps_2_0 PSMain();
}
}
Вкуришь данный фрагмент дальше попрет само собой.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.12.2014, 01:57
|
#5
|
Нуждающийся
Регистрация: 28.12.2010
Сообщений: 55
Написано одно полезное сообщение
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Я думаю, что если дать мне полный шейдер, то у меня как раз не возникнет вопросов)) Он будет исчерпан...когда написал пост я потом что и делал читал про шейдеры и изучал семплы .... так что Please me help
|
(Offline)
|
|
20.12.2014, 02:20
|
#6
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Сообщение от MOrtAl44444
Я думаю, что если дать мне полный шейдер, то у меня как раз не возникнет вопросов)) Он будет исчерпан...когда написал пост я потом что и делал читал про шейдеры и изучал семплы .... так что Please me help
|
Никто тебе такой шейдер не даст потому что его ни у кого нет.
Его нужно написать под конкретно твою задачу. Станет ли кто-то это делать за тебя? Вряд ли.
Что конкретно тебе непонятно? Как прочитать пиксель из текстуры? Как их смешать?
Пусть у нас будет какая-то "подложка" — диффузина, которая есть всегда, в любом месте меша. Например пусть это будет текстура скалы.
Потом у нас есть другие текстуры - травы, грязи, ещё чего-нибудь.
У нас информация о распределении текстур хранится в цветной кляксе.
В кляксе 4 канала: RGBA.
То есть максимум мы можем раскрасить наш меш в 4 текстуры + подложка, которая есть всегда. Аналогия в Фотошопе (если знаком): подложка — Background-слой, остальные слои — текстуры, их ластиком подтёрли в местах где нужно и наложили друг на друга.
Делаем в шейдере вектор4. В нём мы будем хранить результат. В него сразу записываем данные из текстуры-подложки.
Потом смешиваем его с первой текстурой. Пусть её "интенсивность" обозначается красным каналом из кляксы.
Берём значение R из кляксы. Умножаем на него значение прочитанное из первой текстуры. Умножаем на (1-R) значение подложки. Складываем. Записываем в наш вектор4.
Потом смешиваем со второй текстурой. Пусть её "интенсивность" хранится в канале G кляксы. Читаем оттуда G, умножаем на него тексель второй текстуры. На (1-G) умножаем значение, того, что у нас получилось перед этим. Складываем, помещаем в наш вектор результата.
Аналогично делаешь с каналами B и A если таковые нужны.
Как сделать больше текстур? Решать можно по-разному, проще всего сделать ещё одну "кляксу" для хранения интенсивности ещё текстур.
Хотя сначала сделай с четырьмя чтоб работало, потом двигайся дальше.
В итоге у тебя должен получиться в векторе4 правильно смешанный цвет из всех текстур. Применяешь его как будто пиксель прочитанный из текстуры.
Вот тебе полный алгоритм как делать. Возьми и делай. Задавай вопросы в конкретных местах если не получается.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо ABTOMAT за это полезное сообщение:
|
|
20.12.2014, 02:24
|
#7
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Умножаем на него значение прочитанное из первой текстуры. Умножаем на (1-R) значение подложки. Складываем.
|
это всё делает lerp
(хотя я так понял, ты решил разжевать для понятности его смысл)
|
(Offline)
|
|
20.12.2014, 12:57
|
#8
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Упрощенный способ автомата.
Дорабатывай как тебе надо,набросал за 5 минут.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.12.2014, 14:40
|
#9
|
Нуждающийся
Регистрация: 28.12.2010
Сообщений: 55
Написано одно полезное сообщение
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
diffuse=(tex2D(Stex1S, input.texCoords)*diffuse.r)+(tex2D(Stex2S, input.texCoords)*diffuse.g)+(tex2D(Stex3S, input.texCoords)*diffuse.b),1;
return diffuse * lit * lightColor;
Вот за этот код отдельное спасибо ))
|
(Offline)
|
|
20.12.2014, 14:52
|
#10
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Я не заморачивался с кодом , там все можно переделать на много лучше и как сказал автомат , с 4 текстурами.
Гугли тему Tetxure Splatting.
|
(Offline)
|
|
20.12.2014, 14:53
|
#11
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
http://habrahabr.ru/post/180743/
Вот тут кстати описан хороший принцип как сделать ещё более продвинуто.
Но, как говорится, совершенству нет предела.
Начни с малого и далее вноси улучшения до той степени до какой посчитаешь нужным.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
20.12.2014, 14:55
|
#12
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
diffuse=(tex2D(Stex1S, input.texCoords)*diffuse.r)+(tex2D(Stex2S, input.texCoords)*diffuse.g)+(tex2D(Stex3S, input.texCoords)*diffuse.b),1;
|
так может ненароком заярчение выйти из-за сложения, т.к. ты не умножаешь на 1-альфа нижние слои.
не собирался делать работу за ТСа, но вы меня вынуждаете:
float3 mask = tex2D(texMask, texCoords);
float3 tex0 = tex2D(tex_0, texCoordsTiled);
float3 tex1 = tex2D(tex_1, texCoordsTiled);
float3 tex2 = tex2D(tex_2, texCoordsTiled);
float3 tex3 = tex2D(tex_3, texCoordsTiled);
float3 color = lerp(tex0, tex1, mask.r);
color = lerp(color, tex2, mask.g);
color = lerp(color, tex3, mask.b);
|
(Offline)
|
|
Эти 4 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
20.12.2014, 18:54
|
#13
|
Нуждающийся
Регистрация: 28.12.2010
Сообщений: 55
Написано одно полезное сообщение
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Что не так или я уже в глаза долблюсь!!)
-- Шейдер --
float4x4 world;
float4x4 view;
float4x4 proj;
float maxHeight = 128;
texture displacementMap;
sampler displacementSampler = sampler_state
{
Texture = <displacementMap>;
MipFilter = Point;
MinFilter = Point;
MagFilter = Point;
AddressU = Clamp;
AddressV = Clamp;
};
texture sandMap;
sampler sandSampler = sampler_state
{
Texture = <sandMap>;
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
texture grassMap;
sampler grassSampler = sampler_state
{
Texture = <grassMap>;
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
texture rockMap;
sampler rockSampler = sampler_state
{
Texture = <rockMap>;
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
texture snowMap;
sampler snowSampler = sampler_state
{
Texture = <snowMap>;
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
};
struct VS_INPUT {
float4 position : POSITION;
float4 uv : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 position : POSITION;
float4 uv : TEXCOORD0;
float4 worldPos : TEXCOORD1;
float4 textureWeights : TEXCOORD2;
};
float textureSize = 1024.0f;
float texelSize = 1.0f / 256.0f; //size of one texel;
float4 tex2Dlod_bilinear( sampler texSam, float4 uv )
{
float4 height00 = tex2Dlod(texSam, uv);
float4 height10 = tex2Dlod(texSam, uv + float4(texelSize, 0, 0, 0));
float4 height01 = tex2Dlod(texSam, uv + float4(0, texelSize, 0, 0));
float4 height11 = tex2Dlod(texSam, uv + float4(texelSize , texelSize, 0, 0));
float2 f = frac( uv.xy * textureSize );
float4 tA = lerp( height00, height10, f.x );
float4 tB = lerp( height01, height11, f.x );
return lerp( tA, tB, f.y );
}
VS_OUTPUT Transform(VS_INPUT In)
{
VS_OUTPUT Out = (VS_OUTPUT)0;
float4x4 viewProj = mul(view, proj);
float4x4 worldViewProj= mul(world, viewProj);
float height = tex2Dlod_bilinear( displacementSampler, float4(In.uv.xy,0,0)).r;
In.position.y = height * maxHeight;
Out.worldPos = mul(In.position, world);
Out.position = mul( In.position , worldViewProj);
Out.uv = In.uv;
float4 TexWeights = 0;
TexWeights.x = saturate( 1.0f - abs(height - 0) / 0.2f);
TexWeights.y = saturate( 1.0f - abs(height - 0.3) / 0.25f);
TexWeights.z = saturate( 1.0f - abs(height - 0.6) / 0.25f);
TexWeights.w = saturate( 1.0f - abs(height - 0.9) / 0.25f);
float totalWeight = TexWeights.x + TexWeights.y + TexWeights.z + TexWeights.w;
TexWeights /=totalWeight;
Out.textureWeights = TexWeights;
return Out;
}
float4 PixelShader(in float4 uv : TEXCOORD0, in float4 weights : TEXCOORD2) : COLOR
{
float4 sand = tex2D(sandSampler,uv*;
float4 grass = tex2D(grassSampler,uv*;
float4 rock = tex2D(rockSampler,uv*;
float4 snow = tex2D(snowSampler,uv*;
return sand * weights.x + grass * weights.y + rock * weights.z + snow * weights.w;
}
technique GridDraw
{
pass P0
{
vertexShader = compile vs_3_0 Transform();
pixelShader = compile ps_3_0 PixelShader();
}
}
-- Код в Xors3D --
mesh = xCreateCube()
xScaleEntity mesh, 500, 500, 500
xPositionEntity mesh, 40000, 1300, 30000
effect = xLoadFXFile("1.fx")
xSetEffectMatrixSemantic mesh, "world", MATRIX_WORLD
xSetEffectMatrixSemantic mesh, "view", MATRIX_VIEW
xSetEffectMatrixSemantic mesh, "proj", MATRIX_PROJ
xSetEntityEffect mesh, effect
xSetEffectTechnique mesh, "GridDraw"
xSetEffectTexture mesh, "sandMap",xLoadTexture("sand.jpg")
xSetEffectTexture mesh, "grassMap",xLoadTexture("grass.jpg")
xSetEffectTexture mesh, "rockMap",xLoadTexture("rock.jpg")
xSetEffectTexture mesh, "displacementMap",xLoadTexture("dm.png")
xSetEffectTexture mesh, "snowMap",xLoadTexture("snow.jpg")
|
|
|
(Offline)
|
|
20.12.2014, 19:04
|
#14
|
Бывалый
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений (для 866 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Проверяй шейдер на ошибки через tv3d.
|
(Offline)
|
|
20.12.2014, 20:09
|
#15
|
Быдлокодер
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,024
Написано 2,313 полезных сообщений (для 5,350 пользователей)
|
Ответ: Наложение нескольких текстур на загружаемый Mesh
Проверка шейдера sFXe.7z
Тестер сказал что шейдер рабочий. Упаковывай код в сообщение в соответствующие теги.
Последний Хорс с примерами.
Примеры.
Э, не ту ссылку дал на семплы https://yadi.sk/d/npgfRfwlcjhST, думаю — что-то так мало.
P. S. Хорс в лог тоже может писать ошибки шейдера.
Последний раз редактировалось Arton, 20.12.2014 в 21:36.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:01.
|