# Instanced rotation?

This topic is 1957 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hello,everyone,I am having some confusion about instsancing.I learned it from this example:
[CODE]////////////////////////////////////////////////////////////////////////////////
// Filename: texture.vs
////////////////////////////////////////////////////////////////////////////////

/////////////
// GLOBALS //
/////////////
cbuffer MatrixBuffer
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};

//////////////
// TYPEDEFS //
//////////////
struct VertexInputType
{
float4 position : POSITION;
float2 tex : TEXCOORD0;
float3 instancePosition : TEXCOORD1;
};
struct PixelInputType
{
float4 position : SV_POSITION;
float2 tex : TEXCOORD0;
};

////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
{
PixelInputType output;

// Change the position vector to be 4 units for proper matrix calculations.
input.position.w = 1.0f;
// Update the position of the vertices based on the data for this particular instance.
input.position.x += input.instancePosition.x;
input.position.y += input.instancePosition.y;
input.position.z += input.instancePosition.z;
// Calculate the position of the vertex against the world, view, and projection matrices.
output.position = mul(input.position, worldMatrix);
output.position = mul(output.position, viewMatrix);
output.position = mul(output.position, projectionMatrix);

// Store the texture coordinates for the pixel shader.
output.tex = input.tex;

return output;
}
[/CODE]

I dont get it..like,why does he change the [b]input [/b]structure with the instance data instead of just editing the [b]output [/b]one with the instance data like this:
[CODE]output.position.x += input.instancePosition.x;
output.position.y += input.instancePosition.y;
output.position.z += input.instancePosition.z;[/CODE]
?
Also,if this IS the proper way to do it,then would rotation be done in the same way?(by changing the input structure).Then again,I'm not sure about how rotation would be implemented,maybe create a rotation matrix for each instance for each vertex,using a float3 instanceRotation variable and trig functions?

##### Share on other sites
There's no difference between the two ways. Changing the input structure doesn't actually change the vertices, it just changes them from the point of view of that single shader function.

##### Share on other sites
[quote name='mrheisenberg' timestamp='1347241096' post='4978448']
Also,if this IS the proper way to do it,then would rotation be done in the same way?(by changing the input structure).Then again,I'm not sure about how rotation would be implemented,maybe create a rotation matrix for each instance for each vertex,using a float3 instanceRotation variable and trig functions?
[/quote]

You can either pass rotational values (euler or quaternion) as a shader variable input and create the matrix on the GPU, or use these values on the CPU to produce the final world matrix, and pass the matrix as a float4x4 to the shader.