114 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			114 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| // -------------------------------------------------------------------------------- //
 | |
| // Parameters
 | |
| /// Provided by OBS Studio.
 | |
| uniform float4x4 ViewProj <
 | |
| 	bool visible = false;
 | |
| 	bool disabled = true;
 | |
| >;
 | |
| 
 | |
| uniform texture2d pMaskInputA <
 | |
| 	string name = "Mask Input A";
 | |
| 	string description = "Input to mask.";
 | |
| >;
 | |
| uniform texture2d pMaskInputB <
 | |
| 	string name = "Mask Input B";
 | |
| 	string description = "Input to use as the mask.";
 | |
| >;
 | |
| 
 | |
| uniform float4 pMaskBase <
 | |
| 	string name = "Channel Base";
 | |
| //	float4 minimum = float4(-100.0, -100.0, -100.0, -100.0);
 | |
| //	float4 maximum = float4(100.0, 100.0, 100.0, 100.0);
 | |
| //	float4 default = float4(1, 1, 1, 1);
 | |
| >;
 | |
| uniform float4x4 pMaskMatrix <
 | |
| 	string name = "Channel Matrix";
 | |
| //	float4 minimum = float4x4(
 | |
| //		-100, -100, -100, -100,
 | |
| //		-100, -100, -100, -100,
 | |
| //		-100, -100, -100, -100,
 | |
| //		-100, -100, -100, -100);
 | |
| //	float4 maximum = float4x4(
 | |
| //		100, 100, 100, 100,
 | |
| //		100, 100, 100, 100,
 | |
| //		100, 100, 100, 100,
 | |
| //		100, 100, 100, 100);
 | |
| //	float4 default = float4x4(
 | |
| //		1, 0, 0, 0,
 | |
| //		0, 1, 0, 0,
 | |
| //		0, 0, 1, 0,
 | |
| //		0, 0, 0, 1);
 | |
| >;
 | |
| uniform float4 pMaskMultiplier <
 | |
| 	string name = "Channel Multiplier";
 | |
| //	float4 minimum = float4(-100, -100, -100, -100);
 | |
| //	float4 maximum = float4(100, 100, 100, 100);
 | |
| //	float4 default = float4(1, 1, 1, 1);
 | |
| >;
 | |
| // -------------------------------------------------------------------------------- //
 | |
| 
 | |
| // -------------------------------------------------------------------------------- //
 | |
| // Samplers
 | |
| sampler_state maskSamplerA {
 | |
| 	Filter		= Linear;
 | |
| 	AddressU	= Clamp;
 | |
| 	AddressV	= Clamp;
 | |
| };
 | |
| 
 | |
| sampler_state maskSamplerB {
 | |
| 	Filter		= Linear;
 | |
| 	AddressU	= Clamp;
 | |
| 	AddressV	= Clamp;
 | |
| };
 | |
| // -------------------------------------------------------------------------------- //
 | |
| 
 | |
| // -------------------------------------------------------------------------------- //
 | |
| // Default Vertex Shader
 | |
| struct VertDataIn {
 | |
| 	float4 pos : POSITION;
 | |
| 	float2 uv  : TEXCOORD0;
 | |
| };
 | |
| 
 | |
| struct VertDataOut {
 | |
| 	float4 pos : POSITION;
 | |
| 	float2 uv  : TEXCOORD0;
 | |
| };
 | |
| 
 | |
| VertDataOut VSDefault(VertDataIn v_in)
 | |
| {
 | |
| 	VertDataOut vert_out;
 | |
| 	vert_out.pos = mul(float4(v_in.pos.xyz, 1.0), ViewProj);
 | |
| 	vert_out.uv  = v_in.uv;
 | |
| 	return vert_out;
 | |
| }
 | |
| // -------------------------------------------------------------------------------- //
 | |
| 
 | |
| // -------------------------------------------------------------------------------- //
 | |
| // Channel Masking
 | |
| 
 | |
| float4 PSChannelMask(VertDataOut v_in) : TARGET
 | |
| {
 | |
| 	float4 imageA = pMaskInputA.Sample(maskSamplerA, v_in.uv);
 | |
| 
 | |
| 	// Create Mask
 | |
| 	float4 mask = pMaskBase;
 | |
| 	float4 imageB = pMaskInputB.Sample(maskSamplerB, v_in.uv);
 | |
| 	mask += pMaskMatrix[0] * imageB.r;
 | |
| 	mask += pMaskMatrix[1] * imageB.g;
 | |
| 	mask += pMaskMatrix[2] * imageB.b;
 | |
| 	mask += pMaskMatrix[3] * imageB.a;
 | |
| 	mask *= pMaskMultiplier;
 | |
| 
 | |
| 	return imageA * mask;
 | |
| }
 | |
| 
 | |
| technique Mask
 | |
| {
 | |
| 	pass
 | |
| 	{
 | |
| 		vertex_shader = VSDefault(v_in);
 | |
| 		pixel_shader = PSChannelMask(v_in);
 | |
| 	}
 | |
| }
 | |
| // -------------------------------------------------------------------------------- //
 |