Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


#Actualmhagain

Posted 12 July 2013 - 03:23 PM

The easiest way would be to use a geometry shader.  Input one point, output a 4-vert tristrip, and just lift it from the software version.  You don't need to use instancing with this method, although having the GS stage active will introduce some (small) additional overhead.  If that's acceptable, then go do it.

 

Another method would be to use an additional per-vertex buffer, containing 4 verts.  This buffer can be static, and each vertex is 2 floats: {{-1, -1}, {1, -1}, {-1, 1}, {1, 1}} works well for one tristrip ordering (other tristrip orderings will be different, of course).  Let's assume that this is called "offset" in your VS input struct, that "position" is a float3, and you get the following:

vs_out.position = mul (float4 (vs_in.position + right * offset.x + up * offset.y, 1.0f), globalMVP);

If you want each billboard to have a variable scale ("scale" in your input struct) modify like so:

vs_out.position = mul (float4 (vs_in.position + (right * offset.x + up * offset.y) * vs_in.scale, 1.0f), globalMVP)

This isn't exactly the same as the example in the link I posted; that one produces a diamond shape, this one is a square.

 

These "offsets" can alternatively be indexed via SV_VertexID and also be reused for texcoords, by the way.


#2mhagain

Posted 12 July 2013 - 03:22 PM

The easiest way would be to use a geometry shader.  Input one point, output a 4-vert tristrip, and just lift it from the software version.  You don't need to use instancing with this method, although having the GS stage active will introduce some (small) additional overhead.  If that's acceptable, then go do it.

 

Another method would be to use an additional per-vertex buffer, containing 4 verts.  This buffer can be static, and each vertex is 2 floats: {{-1, -1}, {1, -1}, {-1, 1}, {1, 1}} works well for one tristrip ordering (other tristrip orderings will be different, of course).  Let's assume that this is called "offset" in your VS input struct, that "position" is a float3, and you get the following:

vs_out.position = mul (float4 (vs_in.position + right * offset.x + up * offset.y, 1.0f), globalMVP);

If you want each billboard to have a variable scale ("scale" in your input struct) modify like so:

vs_out.position = mul (float4 (vs_in.position + (right * offset.x + up * offset.y) * vs_in.scale, 1.0f), globalMVP)

This isn't exactly the same as the example in the link I posted; that one produces a diamond shape, this one is a square.

 

These "offsets" can also be used for texcoords, by the way.


#1mhagain

Posted 12 July 2013 - 03:21 PM

The easiest way would be to use a geometry shader.  Input one point, output a 4-vert tristrip, and just lift it from the software version.  You don't need to use instancing with this method, although having the GS stage active will introduce some (small) additional overhead.  If that's acceptable, then go do it.

 

Another method would be to use an additional per-vertex buffer, containing 4 verts.  This buffer can be static, and each vertex is 2 floats: {{-1, -1}, {1, -1}, {-1, 1}, {1, 1}} works well for one tristrip ordering (other tristrip orderings will be different, of course).  Let's assume that this is called "offset" in your VS input struct, that "position" is a float3, and you get the following:

vs_out.position = mul (float4 (vs_in.position + right * offset.x + up * offset.y, 1.0f), globalMVP);

If you want each billboard to have a variable scale ("scale" in your input struct) modify like so:

vs_out.position = mul (float4 (vs_in.position + (right * offset.x + up * offset.y) * vs_in.scale, 1.0f), globalMVP)

This isn't exactly the same as the example in the link I posted; that one produces a diamond shape, this one is a square.

 

These "offsets" can also be used for texcoords, by the way.


PARTNERS