Jump to content

  • Log In with Google      Sign In   
  • Create Account

Trying to make a lazer beam on the gpu


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 ankhd   Members   -  Reputation: 1359

Like
0Likes
Like

Posted 06 February 2013 - 04:21 AM

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);
  } 
 }
}
 

 



Sponsor:

#2 ankhd   Members   -  Reputation: 1359

Like
1Likes
Like

Posted 07 February 2013 - 04:57 AM

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



#3 ankhd   Members   -  Reputation: 1359

Like
0Likes
Like

Posted 09 February 2013 - 10:18 PM

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





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS