1
\$\begingroup\$

I have encountered a weird x.wwww component of the float4 x vector in a HLSL code. I haven't seen such a member or member function of float4 structures in HLSL, so please tell me what is the meaning of that. It is in the code of this pixel shader:

float4 PSConstantColor( PS_PARTICLE_INPUT input ) : SV_TARGET
{
   // Sample particle texture
   float4 vColor = g_baseTexture.Sample( g_samLinear, input.Tex ).wwww;

   // Clip fully transparent pixels
   clip( vColor.a - 1.0/255.0 );

   // Return color
   return vColor;
}

At first I thought it should be the w component replicated to all the members of the float4 vColor vector, but it does not make sense for the color value, does it?

\$\endgroup\$
4
\$\begingroup\$

From my understanding they are called swizzle operators. In this case they make a float4 of the 4th element in the given float4:

vColor = (w, w, w, w)

Where w is g_baseTexture.Sample( g_samLinear, input.Tex ).w

Here is an example of a swizzle operator in practice:

float3 cross( float3 a, float3 b ) {
    return float3( a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.z*b.y - a.y*b.z );
}

and its equivalent swizzle implementation

float3 cross( float3 a, float3 b ) {
    return a.yzx*b.zxy - a.zxy*b.yzx;
}
\$\endgroup\$
  • \$\begingroup\$ I thought so too, but when I searched MSDN for this wwww swizzle operator, as you said, it does not show it as a part of float4 structure. Other operators you mentioned (xyz,zxy etc.) are clearly explained but non of wwww is present. I searched here: msdn.microsoft.com/en-us/library/windows/desktop/… but found nothing about it. \$\endgroup\$ – Pekov Jun 24 '15 at 12:24
  • \$\begingroup\$ Yes I got it now, though I still can't understand the meaning of such a color value, except outputing grayscale image of the texture. \$\endgroup\$ – Pekov Jun 24 '15 at 12:43
  • 1
    \$\begingroup\$ @Pekov - it's not so unusual to use this kind of swizzle, even when you want non-greyscale output. For example, a CoCg_Y-DXT5 decoding shader might use colour = sample.aaaa (or equivalently, sample.wwww) to "broadcast" the luma component (stored in the alpha channel) to all colour channels as a first step, and then add the Co & Cg chroma offsets to each of r, g, and b in subsequent steps, to tint the initial grey to the desired output colour. \$\endgroup\$ – DMGregory Jun 24 '15 at 16:33
  • 1
    \$\begingroup\$ @Pekov: Those are not actual structure members. They are HLSL language functionality. The compiler generates code for them. \$\endgroup\$ – Tara Mar 9 '17 at 17:54

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.