Показать сообщение отдельно
Старый 09.03.2012, 22:49   #13
Taugeshtu
scientist.alien
 
Аватар для Taugeshtu
 
Регистрация: 12.02.2007
Сообщений: 2,098
Написано 1,030 полезных сообщений
(для 2,593 пользователей)
Ответ: Мультитекстуринг

больше - сложнее, и скорее всего сведется к созданию дополнительных поверхностей.
Запихивал в ксорс шейдером 8 текстур, алгоритм топорен донельзя:
  • в альфа-канал суём маску для текстуры (можно нарисовать в любой 3д-малевалке по любому мешу-террейну (я лично использовал для летающих островов) любым интересующим цветом маску, а потом сунуть в каком-нибудь фотошопе);
  • в rbg - саму диффузную текстуру (да, фокусы с нормалями не сделать, печаль..);
  • опционально передаём масштабирование отдельно на каждый слой и смещение каким-нибудь 4-хкомпонентным вектором;
  • смешиваем в порядке следования по альфе...

Где-то даже лежит (наверное) у меня исходник шейдера...
В качестве "бонуса" - 16 выборок на пиксель, да.

Вот шейдер; правда комменты похерились в кодировке... Ну и леший с ними:

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
float4x4 matrixWorld         : MATRIX_WORLD;         // пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
float3   lightDirection      : LIGHT0_DIRECTION;     // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
float4   lightColor          : LIGHT0_COLOR;         // пїЅпїЅпїЅпїЅ
float4   entityColor         : COLOR_DIFFUSE;        // пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
float4      size0            ;
float4      size1            ;
texture  lay0                : TEXTURE_0;            // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
texture  lay1                : TEXTURE_1;            // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
texture  lay2                : TEXTURE_2;            // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
texture  lay3                : TEXTURE_3;            // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
texture  lay4                : TEXTURE_4;            // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
texture  lay5                : TEXTURE_5;            // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
texture  lay6                : TEXTURE_6;            // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
texture  lay7                : TEXTURE_7;            // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
// LAYER_0
sampler layer_0 = sampler_state
{
	Texture = <lay0>; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	AddressU      = WRAP;
	AddressV      = WRAP;
	AddressW      = WRAP;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MinFilter     = ANISOTROPIC;
	MagFilter     = ANISOTROPIC;
	MipFilter     = ANISOTROPIC;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MaxAnisotropy = 4;
};
// LAYER_1
sampler layer_1 = sampler_state
{
	Texture = <lay1>; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	AddressU      = WRAP;
	AddressV      = WRAP;
	AddressW      = WRAP;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MinFilter     = ANISOTROPIC;
	MagFilter     = ANISOTROPIC;
	MipFilter     = ANISOTROPIC;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MaxAnisotropy = 4;
};
// LAYER_2
sampler layer_2 = sampler_state
{
	Texture = <lay2>; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	AddressU      = WRAP;
	AddressV      = WRAP;
	AddressW      = WRAP;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MinFilter     = ANISOTROPIC;
	MagFilter     = ANISOTROPIC;
	MipFilter     = ANISOTROPIC;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MaxAnisotropy = 4;
};
// LAYER_3
sampler layer_3 = sampler_state
{
	Texture = <lay3>; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	AddressU      = WRAP;
	AddressV      = WRAP;
	AddressW      = WRAP;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MinFilter     = ANISOTROPIC;
	MagFilter     = ANISOTROPIC;
	MipFilter     = ANISOTROPIC;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MaxAnisotropy = 4;
};
// LAYER_4
sampler layer_4 = sampler_state
{
	Texture = <lay4>; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	AddressU      = WRAP;
	AddressV      = WRAP;
	AddressW      = WRAP;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MinFilter     = ANISOTROPIC;
	MagFilter     = ANISOTROPIC;
	MipFilter     = ANISOTROPIC;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MaxAnisotropy = 4;
};
// LAYER_5
sampler layer_5 = sampler_state
{
	Texture = <lay5>; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	AddressU      = WRAP;
	AddressV      = WRAP;
	AddressW      = WRAP;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MinFilter     = ANISOTROPIC;
	MagFilter     = ANISOTROPIC;
	MipFilter     = ANISOTROPIC;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MaxAnisotropy = 4;
};
// LAYER_6
sampler layer_6 = sampler_state
{
	Texture = <lay6>; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	AddressU      = WRAP;
	AddressV      = WRAP;
	AddressW      = WRAP;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MinFilter     = ANISOTROPIC;
	MagFilter     = ANISOTROPIC;
	MipFilter     = ANISOTROPIC;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MaxAnisotropy = 4;
};// LAYER_7
sampler layer_7 = sampler_state
{
	Texture = <lay7>; // пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	AddressU      = WRAP;
	AddressV      = WRAP;
	AddressW      = WRAP;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MinFilter     = ANISOTROPIC;
	MagFilter     = ANISOTROPIC;
	MipFilter     = ANISOTROPIC;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	MaxAnisotropy = 4;
};
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
struct VSInput
{
	float4 position  : POSITION;
	float3 normal    : NORMAL;
	float2 texCoords : TEXCOORD0;
};
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
struct VSOutput
{
	float4 position  : POSITION;
	float3 normal    : TEXCOORD1;
	float2 texCoords : TEXCOORD0;
};
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
VSOutput VSMain(VSInput input)
{
	// пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
	VSOutput output;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	output.position  = mul(input.position, matrixWorldViewProj);
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	output.normal    = normalize(mul(input.normal, matrixWorld));
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	output.texCoords = input.texCoords;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	return output;
}
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
float4 PSMain(VSOutput input) : COLOR0
{	
	// пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
	float4 m0 = tex2D(layer_0, input.texCoords);
	float4 m1 = tex2D(layer_1, input.texCoords);
	float4 m2 = tex2D(layer_2, input.texCoords);
	float4 m3 = tex2D(layer_3, input.texCoords);
	float4 m4 = tex2D(layer_4, input.texCoords);
	float4 m5 = tex2D(layer_5, input.texCoords);
	float4 m6 = tex2D(layer_6, input.texCoords);
	float4 m7 = tex2D(layer_7, input.texCoords);
	float4 d0 = tex2D(layer_0, input.texCoords * size0.x);
	float4 d1 = tex2D(layer_1, input.texCoords * size0.y);
	float4 d2 = tex2D(layer_2, input.texCoords * size0.z);
	float4 d3 = tex2D(layer_3, input.texCoords * size0.w);
	float4 d4 = tex2D(layer_4, input.texCoords * size1.x);
	float4 d5 = tex2D(layer_5, input.texCoords * size1.y);
	float4 d6 = tex2D(layer_6, input.texCoords * size1.z);
	float4 d7 = tex2D(layer_7, input.texCoords * size1.w);
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ
	float lit = dot(input.normal, -lightDirection);
	// ambient
	lit = max(0.15, lit);
	float4 result = ((((((d0*(1-m1.a)+d1*m1.a)*(1-m2.a)+d2*m2.a)*(1-m3.a)+d3*m3.a)*(1-m4.a)+d4*m4.a)*(1-m5.a)+d5*m5.a)*(1-m6.a)+d6*m6.a)*(1-m7.a)+d7*m7.a;
	// пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
//	result = (result * entityColor * lit * lightColor);
//	result.a = 0.5;
//	return result;
	return (result * entityColor * lit * lightColor);
}
// пїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
technique multi_tile
{
	pass p0
	{
//		AlphaBlendEnable= true;
		VertexShader = compile vs_2_0 VSMain();
		PixelShader  = compile ps_2_0 PSMain();
	}
}
__________________
Public service announcement: вы можете заблокировать отображение сообщений определённого пользователя, добавив его ник в список игнорируемых.
Tau lab.
We LOVE you. We MADE you.
(Offline)
 
Ответить с цитированием