Тема: Xors3D
Показать сообщение отдельно
Старый 25.07.2014, 05:17   #705
Arton
Быдлокодер
 
Аватар для Arton
 
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,021
Написано 2,312 полезных сообщений
(для 5,349 пользователей)
Ответ: Xors3D

Сообщение от Mr_F_ Посмотреть сообщение
делай маску в шейдере сам через clip или discard
Можно пожалуйста подробней?

Изучая урок по шейдерам для Хорса наткнулся вот на это:

"if (diffuse.a < 0.5f) discard; // реализация маски"

И попробовал вставить так (копипаста из урока):

float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld	     : MATRIX_WORLD;	     // матрица мировая

float3	 lightDirection	     : LIGHT0_DIRECTION;     // направление
float4	 lightColor	     : LIGHT0_COLOR;	     // цвет

float4	 entityColor	     : COLOR_DIFFUSE;	     // цвет объекта
texture  diffuseTexture      : TEXTURE_0;	     // текстура

// описываем sampler
sampler	diffuseSampler = sampler_state

{
	Texture = <diffuseTexture>;	// привязываем текстуру

	// устанавливаем адресацию координат

	AddressU	= WRAP;
	AddressV	= WRAP;
	AddressW	= WRAP;

	// устанавливаем фильтрацию

	MinFilter	= ANISOTROPIC;
	MagFilter	= ANISOTROPIC;
	MipFilter	= ANISOTROPIC;

	// устанавливаем уровень фильтрации

	MaxAnisotropy	= 8;
};

// входная структура для вершинного шейдера

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 diffuse  = tex2D(diffuseSampler, input.texCoords);

	if (diffuse.a < 0.5f) discard; // реализация маски

	// расчитываем освещенность точки

	float lit 	= dot(input.normal, 8lightDirection);

	// возвращаем результирующий цвет пиксела

	return diffuse * entityColor * lit * lightColor;
}

technique Diffuse

{
	pass p0
	{

		PixelShader  = compile vs_3_0 VSMain();
		VertexShader = compile ps_3_0 PSMain();
	}
}


Я ещё тот нуб, не люблю читать всё от "корки док корки", стараюсь параллельно действовать самому. Короче отдельные элементы я вроде понимаю, но весь код шейдера вместе не осознаю.

"0.5f" это цвет? То есть если я понимаю - если в текстуре найден прозрачный пиксель(?) режем его?

"diffuse.a" - зачем точка?
(Offline)
 
Ответить с цитированием