Sign in to follow this  
ankhd

Trying to make a lazer beam on the gpu

Recommended Posts

Hi all.

Im trying to make a box with no ends based on two 3d locations the target and the start points.

 

I think I have something wrong with my vertices when I create four quads on the gpu.

 

Here is a Image of what Im talking about.

 

BoxGPU.jpg?psid=1

 

 

 

this is the shader code Ill just paste where I create the 4 quads.

 


// The draw GS just expands 2 3dvectors the target and the start to 4 quads
[maxvertexcount(16)]
void DrawGS(point VS_OUT gIn[1],
            inout TriangleStream<GS_OUT> triStream)
{ 
 // do not draw emitter particles.
 if( gIn[0].type != PT_EMITTER )
 {
  float4x4 WVP = gViewProj;//mul(W, gViewProj);
  
  //
  // Compute 4 triangle strip vertices (quad) in local space.
  // The quad faces down the +z axis in local space.
  //
 // float halfWidth  = (0.5f*gIn[0].sizeW.x);// * scale;
 // float halfHeight = (0.5f*gIn[0].sizeW.y);// * scale;
 
  float4 v[16];
  //we make this shape here
  //      ____________
  //  4  /\  1 faces  \
  //    /  \___________\
  //    \  /   2       /
  //   3 \/___________/
 
  //wdthp heightp are the width and height of the starting point of the lazer
  //wdtht heightt are going to be the width and height of the tearget end
  //gEmitDirW is a vector3 in 3d world coords and now a direction in this shader its a target
  float wdthp = gParticleWidth;//starting points width
  float wdtht = ggrowamount;//the targets z width
  float heightp = gParticleHeight;//height of the starting end of the lazer
  float heightt = fSpeed;//height of the target end
  
  //make a quad from pos to target face 1
  v[0] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z - wdtht, 1.0f);
  v[1] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z - wdthp, 1.0f);
  v[2] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z + wdthp, 1.0f);
  v[3] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z + wdtht, 1.0f);
  
  //face 2
  v[4] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z + wdtht, 1.0f);
  v[5] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z + wdthp, 1.0f);
  v[6] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z + wdthp, 1.0f);
  v[7] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z + wdtht, 1.0f);
  
  //face 3
  v[8] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z - wdtht, 1.0f);
  v[9] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z - wdthp, 1.0f);
  v[10] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z + wdthp, 1.0f);
  v[11] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z + wdtht, 1.0f);
  
  //face 4
  v[12] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z - wdtht, 1.0f);
  v[13] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z - wdthp, 1.0f);
  v[14] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z - wdthp, 1.0f);
  v[15] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z - wdtht, 1.0f);
  
  //
  // Transform quad vertices to world space and output
  // them as a triangle strip.
  //
  GS_OUT gOut;
  [unroll]
  for(int i = 0; i < 16; ++i)
  {
   gOut.posH  = mul(v[i], WVP);
   gOut.texC  = gQuadTexC[i];
   gOut.color = gIn[0].color;
   gOut.arrayid = gIn[0].arrayid;
   triStream.Append(gOut);
  } 
 }
}
 

 

Share this post


Link to post
Share on other sites

Ok found it, was late, winding order

1-------2

 |         |

3-------4

 

/here is the vertex code and image plus a triangle shape yay.......

 

 

//we make this shape here
  //       ____________
  //  4  /\  1 faces         \
  //     /   \___________\
  //     \   /   2                /
  //   3 \/___________/
 
  //wdthp heightp are the width and height of the starting point of the lazer
  //wdtht heightt are going to be the width and height of the tearget end
  //gEmitDirW is a vector3 in 3d world coords and now a direction in this shader its a target
  float wdthp = gParticleWidth;//starting points width
  float wdtht = ggrowamount;//the targets z width
  float heightp = gParticleHeight;//height of the starting end of the lazer
  float heightt = fSpeed;//height of the target end
  
  //make a quad from pos to target face 1
  v[0] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z - wdtht, 1.0f);
  v[1] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z - wdthp, 1.0f);
  v[2] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z + wdtht, 1.0f);
  v[3] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z + wdthp, 1.0f);
  
  //face 2
  v[4] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z + wdtht, 1.0f);
  v[5] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z + wdthp, 1.0f);
  v[6] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z + wdtht, 1.0f);
  v[7] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z + wdthp, 1.0f);
  
  //face 3
  v[8] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z + wdtht, 1.0f);
  v[9] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z + wdthp, 1.0f);
  v[10] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z - wdtht, 1.0f);
  v[11] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z - wdthp, 1.0f);
  
  //face 4
  v[12] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z - wdtht, 1.0f);
  v[13] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z - wdthp, 1.0f);
  v[14] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z - wdtht, 1.0f);
  v[15] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z - wdthp, 1.0f);
  
  
  /*
  
  //make a triangle
  //      __________________________
  //     /\__________________________\
  
  v[0] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z + wdtht, 1.0f);
  v[1] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z + wdthp, 1.0f);
  v[2] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z, 1.0f);
  v[3] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z, 1.0f);
  
  //face 2
  v[4] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z + wdtht, 1.0f);
  v[5] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z + wdthp, 1.0f);
  v[6] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z - wdtht, 1.0f);
  v[7] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z - wdthp, 1.0f);
  
  //face 3
  v[8] = float4(gEmitDirW.x, gEmitDirW.y + heightt, gEmitDirW.z, 1.0f);
  v[9] = float4(gEmitPosW.x, gEmitPosW.y + heightp, gEmitPosW.z, 1.0f);
  v[10] = float4(gEmitDirW.x, gEmitDirW.y - heightt, gEmitDirW.z - wdtht, 1.0f);
  v[11] = float4(gEmitPosW.x, gEmitPosW.y - heightp, gEmitPosW.z - wdthp, 1.0f);
  
  */

 

 

 

 

 

 

BoxGPUFixed.jpg?psid=1

Share this post


Link to post
Share on other sites

Oh I found a bug if the postion.x  is greater then the targets.x location I need to swop the values.
Is the way i'm doing it the only way or is there another way I should be doing the swop or the math behind it thanks.



//I need to swop the values if pos.x is heigher then target.x

float3 target = gEmitDirW;
float3 pos  = gEmitPosW;
if(pos.x >target.x)
{
//swop all vars
   
target = gEmitPosW;
pos = gEmitDirW;
   
float temp = wdthp;
wdthp = wdtht;
wdtht = temp;
   
temp = heightp;
heightp = heightt;
heightt = heightp;
   
}//end swop vars

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this