forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Наложение нескольких текстур на загружаемый Mesh (http://forum.boolean.name/showthread.php?t=19589)

MOrtAl44444 19.12.2014 18:28

Наложение нескольких текстур на загружаемый Mesh
 
Вложений: 4
Помогите пожалуйста. 3 дня мучаюсь над этим вопросом, уже все учебники, статьи и примеры пересмотрел - ни один из них не подходит.

:::::: КОД ::::::
;загружаем Mesh
mesh = xloadmesh("mesh.3ds")

;вызываем функцию текстурирования
mesh_texture_splatting()

Скажите суть метода, какие команды потребуется или может у кого-то алгоритм есть ))

Например нам дана вот такая маска и каждый цвет на ней ссответствует определенной текстуре.
->->->

MOrtAl44444 19.12.2014 18:36

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Вложений: 12
Или нам даны maps и textures.
Где map (карта гор, карта_травы, карта_еще травы, карта_еще гор, карта нормалей)
А где textures( разные текстурки рисующие по белому цвету на maps)
+ ну еще в добавок можно текстуру Detail

ABTOMAT 19.12.2014 18:57

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Пиксельный шейдер в том состоянии в каком он сейчас в студию!

Izunad 20.12.2014 01:43

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Если тебе дать готовый шейдер, ты начнешь задавать много много вопросов.
Начни с малого:
  1. изучи конвейер визуализации
  2. структуру написания шейдера
  3. "загрузку" текстур, каких то значений в шейдер
  4. пиксельный шейдер
  5. мультитекстурирование

Код:

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();
        }
}

Вкуришь данный фрагмент дальше попрет само собой.

MOrtAl44444 20.12.2014 01:57

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Я думаю, что если дать мне полный шейдер, то у меня как раз не возникнет вопросов)) Он будет исчерпан...когда написал пост я потом что и делал читал про шейдеры и изучал семплы .... так что Please me help

ABTOMAT 20.12.2014 02:20

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Цитата:

Сообщение от MOrtAl44444 (Сообщение 290884)
Я думаю, что если дать мне полный шейдер, то у меня как раз не возникнет вопросов)) Он будет исчерпан...когда написал пост я потом что и делал читал про шейдеры и изучал семплы .... так что Please me help

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

Что конкретно тебе непонятно? Как прочитать пиксель из текстуры? Как их смешать?

Пусть у нас будет какая-то "подложка" — диффузина, которая есть всегда, в любом месте меша. Например пусть это будет текстура скалы.
Потом у нас есть другие текстуры - травы, грязи, ещё чего-нибудь.

У нас информация о распределении текстур хранится в цветной кляксе.
В кляксе 4 канала: RGBA.
То есть максимум мы можем раскрасить наш меш в 4 текстуры + подложка, которая есть всегда. Аналогия в Фотошопе (если знаком): подложка — Background-слой, остальные слои — текстуры, их ластиком подтёрли в местах где нужно и наложили друг на друга.

Делаем в шейдере вектор4. В нём мы будем хранить результат. В него сразу записываем данные из текстуры-подложки.

Потом смешиваем его с первой текстурой. Пусть её "интенсивность" обозначается красным каналом из кляксы.
Берём значение R из кляксы. Умножаем на него значение прочитанное из первой текстуры. Умножаем на (1-R) значение подложки. Складываем. Записываем в наш вектор4.

Потом смешиваем со второй текстурой. Пусть её "интенсивность" хранится в канале G кляксы. Читаем оттуда G, умножаем на него тексель второй текстуры. На (1-G) умножаем значение, того, что у нас получилось перед этим. Складываем, помещаем в наш вектор результата.

Аналогично делаешь с каналами B и A если таковые нужны.
Как сделать больше текстур? Решать можно по-разному, проще всего сделать ещё одну "кляксу" для хранения интенсивности ещё текстур.
Хотя сначала сделай с четырьмя чтоб работало, потом двигайся дальше.

В итоге у тебя должен получиться в векторе4 правильно смешанный цвет из всех текстур. Применяешь его как будто пиксель прочитанный из текстуры.

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

Mr_F_ 20.12.2014 02:24

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Цитата:

Умножаем на него значение прочитанное из первой текстуры. Умножаем на (1-R) значение подложки. Складываем.
это всё делает lerp
(хотя я так понял, ты решил разжевать для понятности его смысл)

tirarex 20.12.2014 12:57

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Вложений: 1
Упрощенный способ автомата.
Дорабатывай как тебе надо,набросал за 5 минут.

MOrtAl44444 20.12.2014 14:40

Ответ: Наложение нескольких текстур на загружаемый 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;

Вот за этот код отдельное спасибо ))

tirarex 20.12.2014 14:52

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Я не заморачивался с кодом , там все можно переделать на много лучше и как сказал автомат , с 4 текстурами.
Гугли тему Tetxure Splatting.

ABTOMAT 20.12.2014 14:53

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
http://habrahabr.ru/post/180743/
Вот тут кстати описан хороший принцип как сделать ещё более продвинуто.
Но, как говорится, совершенству нет предела.
Начни с малого и далее вноси улучшения до той степени до какой посчитаешь нужным.

Mr_F_ 20.12.2014 14:55

Ответ: Наложение нескольких текстур на загружаемый 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);


MOrtAl44444 20.12.2014 18:54

Ответ: Наложение нескольких текстур на загружаемый 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*8);
float4 grass = tex2D(grassSampler,uv*8);
float4 rock = tex2D(rockSampler,uv*8);
float4 snow = tex2D(snowSampler,uv*8);
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")



tirarex 20.12.2014 19:04

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Проверяй шейдер на ошибки через tv3d.

Arton 20.12.2014 20:09

Ответ: Наложение нескольких текстур на загружаемый Mesh
 
Проверка шейдера sFXe.7z
Тестер сказал что шейдер рабочий. Упаковывай код в сообщение в соответствующие теги.

Последний Хорс с примерами.
Примеры.

Э, не ту ссылку дал на семплы https://yadi.sk/d/npgfRfwlcjhST, думаю — что-то так мало.

P. S. Хорс в лог тоже может писать ошибки шейдера.


Часовой пояс GMT +4, время: 04:20.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot