Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 19.12.2014, 18:28   #1
MOrtAl44444
Нуждающийся
 
Аватар для MOrtAl44444
 
Регистрация: 28.12.2010
Сообщений: 55
Написано одно полезное сообщение
Хорошо Наложение нескольких текстур на загружаемый Mesh

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

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

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

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

Например нам дана вот такая маска и каждый цвет на ней ссответствует определенной текстуре.
->->->
Миниатюры
Нажмите на изображение для увеличения
Название: 23.png
Просмотров: 1059
Размер:	907.6 Кб
ID:	21273  Нажмите на изображение для увеличения
Название: grass1.jpg
Просмотров: 1062
Размер:	18.6 Кб
ID:	21274  Нажмите на изображение для увеличения
Название: rock.jpg
Просмотров: 1083
Размер:	47.6 Кб
ID:	21275  Нажмите на изображение для увеличения
Название: rock1b.jpg
Просмотров: 1008
Размер:	14.3 Кб
ID:	21276  
(Offline)
 
Ответить с цитированием
Старый 19.12.2014, 18:36   #2
MOrtAl44444
Нуждающийся
 
Аватар для MOrtAl44444
 
Регистрация: 28.12.2010
Сообщений: 55
Написано одно полезное сообщение
Ответ: Наложение нескольких текстур на загружаемый Mesh

Или нам даны maps и textures.
Где map (карта гор, карта_травы, карта_еще травы, карта_еще гор, карта нормалей)
А где textures( разные текстурки рисующие по белому цвету на maps)
+ ну еще в добавок можно текстуру Detail
Миниатюры
Нажмите на изображение для увеличения
Название: nm.jpg
Просмотров: 1102
Размер:	683.8 Кб
ID:	21281  Нажмите на изображение для увеличения
Название: grass1-lush.jpg
Просмотров: 1051
Размер:	18.6 Кб
ID:	21282  Нажмите на изображение для увеличения
Название: detailmap_bump.jpg
Просмотров: 1082
Размер:	228.2 Кб
ID:	21283  Нажмите на изображение для увеличения
Название: grass1.jpg
Просмотров: 1103
Размер:	19.7 Кб
ID:	21284  Нажмите на изображение для увеличения
Название: rock1b.jpg
Просмотров: 1062
Размер:	14.3 Кб
ID:	21285  

Нажмите на изображение для увеличения
Название: rock1.jpg
Просмотров: 1059
Размер:	13.2 Кб
ID:	21286  Нажмите на изображение для увеличения
Название: detailmap.jpg
Просмотров: 1012
Размер:	69.5 Кб
ID:	21287  Нажмите на изображение для увеличения
Название: detail.jpg
Просмотров: 1082
Размер:	26.7 Кб
ID:	21288  
Изображения
    
(Offline)
 
Ответить с цитированием
Старый 19.12.2014, 18:57   #3
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Наложение нескольких текстур на загружаемый Mesh

Пиксельный шейдер в том состоянии в каком он сейчас в студию!
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 20.12.2014, 01:43   #4
Izunad
ПроЭктировщик
 
Аватар для Izunad
 
Регистрация: 02.06.2011
Адрес: Набережные Челны
Сообщений: 103
Написано 27 полезных сообщений
(для 91 пользователей)
Ответ: Наложение нескольких текстур на загружаемый 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();
	}
}
Вкуришь данный фрагмент дальше попрет само собой.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
MOrtAl44444 (20.12.2014)
Старый 20.12.2014, 01:57   #5
MOrtAl44444
Нуждающийся
 
Аватар для MOrtAl44444
 
Регистрация: 28.12.2010
Сообщений: 55
Написано одно полезное сообщение
Ответ: Наложение нескольких текстур на загружаемый Mesh

Я думаю, что если дать мне полный шейдер, то у меня как раз не возникнет вопросов)) Он будет исчерпан...когда написал пост я потом что и делал читал про шейдеры и изучал семплы .... так что Please me help
(Offline)
 
Ответить с цитированием
Старый 20.12.2014, 02:20   #6
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 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 за это полезное сообщение:
moka (20.12.2014), MOrtAl44444 (20.12.2014), tirarex (20.12.2014)
Старый 20.12.2014, 02:24   #7
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Наложение нескольких текстур на загружаемый Mesh

Умножаем на него значение прочитанное из первой текстуры. Умножаем на (1-R) значение подложки. Складываем.
это всё делает lerp
(хотя я так понял, ты решил разжевать для понятности его смысл)
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 20.12.2014, 12:57   #8
tirarex
Бывалый
 
Аватар для tirarex
 
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений
(для 866 пользователей)
Ответ: Наложение нескольких текстур на загружаемый Mesh

Упрощенный способ автомата.
Дорабатывай как тебе надо,набросал за 5 минут.
Вложения
Тип файла: zip source.zip (1,007.6 Кб, 536 просмотров)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
MOrtAl44444 (20.12.2014)
Старый 20.12.2014, 14:40   #9
MOrtAl44444
Нуждающийся
 
Аватар для MOrtAl44444
 
Регистрация: 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
tirarex
Бывалый
 
Аватар для tirarex
 
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений
(для 866 пользователей)
Ответ: Наложение нескольких текстур на загружаемый Mesh

Я не заморачивался с кодом , там все можно переделать на много лучше и как сказал автомат , с 4 текстурами.
Гугли тему Tetxure Splatting.
(Offline)
 
Ответить с цитированием
Старый 20.12.2014, 14:53   #11
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: Наложение нескольких текстур на загружаемый Mesh

http://habrahabr.ru/post/180743/
Вот тут кстати описан хороший принцип как сделать ещё более продвинуто.
Но, как говорится, совершенству нет предела.
Начни с малого и далее вноси улучшения до той степени до какой посчитаешь нужным.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Старый 20.12.2014, 14:55   #12
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 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);
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Эти 4 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
ABTOMAT (20.12.2014), Izunad (20.12.2014), MOrtAl44444 (20.12.2014), tirarex (20.12.2014)
Старый 20.12.2014, 18:54   #13
MOrtAl44444
Нуждающийся
 
Аватар для MOrtAl44444
 
Регистрация: 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
tirarex
Бывалый
 
Аватар для tirarex
 
Регистрация: 23.11.2011
Сообщений: 863
Написано 334 полезных сообщений
(для 866 пользователей)
Ответ: Наложение нескольких текстур на загружаемый Mesh

Проверяй шейдер на ошибки через tv3d.
(Offline)
 
Ответить с цитированием
Старый 20.12.2014, 20:09   #15
Arton
Быдлокодер
 
Аватар для Arton
 
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,019
Написано 2,312 полезных сообщений
(для 5,349 пользователей)
Ответ: Наложение нескольких текстур на загружаемый Mesh

Проверка шейдера sFXe.7z
Тестер сказал что шейдер рабочий. Упаковывай код в сообщение в соответствующие теги.

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

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

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

Последний раз редактировалось Arton, 20.12.2014 в 21:36.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
MOrtAl44444 (20.12.2014)
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com