• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# 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.

2 replies to this topic

### #1ankhd  Members

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.

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.color = gIn[0].color;
gOut.arrayid = gIn[0].arrayid;
triStream.Append(gOut);
}
}
}



### #2ankhd  Members

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

*/


### #3ankhd  Members

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.