Guys:
I have a vertex shader that I use for all my non-terrain models. My per-mesh structure has a flags uint where i can set things like billboard, unlit, etc. Some models have single meshes that need to be billboarded, like a light halo that looks the same from any angle. However, I can't figure out how to successfully billboard the mesh.
Below is my vertex shader.. in the billboard section I've tried various combinations of matrices as you can see.. based on MJP's response in this topic:
http://www.gamedev.net/topic/507808-hlsl-billboard/
PixelInputType VS(VertexInputType input, uint InstanceID : SV_InstanceID )
{
PixelInputType output;
// Fix w
input.position.w = 1.0f;
// Calculate animation matrices
matrix bonematrix = ( float( input.boneweight0 ) / 255.0f ) * BoneMatrices[ input.boneindex0 ];
bonematrix += ( float( input.boneweight1 ) / 255.0f ) * BoneMatrices[ input.boneindex1 ];
bonematrix += ( float( input.boneweight2 ) / 255.0f ) * BoneMatrices[ input.boneindex2 ];
bonematrix += ( float( input.boneweight3 ) / 255.0f ) * BoneMatrices[ input.boneindex3 ];
// World matrix from instance buffer
matrix worldMatrixInstance = InstanceLocations[ InstanceID ];
// Transform via combined bones + world matrix
output.position = mul(input.position, bonematrix);
output.position = mul(output.position, worldMatrixInstance );
// Animate normal the same way
output.normal = mul(input.normal, bonematrix);
output.normal = mul(output.normal, worldMatrixInstance );
// Camera view
output.position = mul(output.position, viewMatrix);
float4 cameraPosition = output.position;
// vertex color
output.vertex_color = input.vertex_color;
// billboard?
if( flags & PER_MESH_FLAG_BILLBOARD )
{
matrix boneWorldMat = mul( bonematrix, worldMatrixInstance );
matrix boneWorldViewMat = mul( boneWorldMat, viewMatrix );
//output.position = input.position + float4( boneWorldMat._41, boneWorldMat._42, boneWorldMat._43, 1.0f );
output.position = input.position + float4( boneWorldViewMat._41, boneWorldViewMat._42, boneWorldViewMat._43, 1.0f );
//output.position = input.position + float4( viewMatrix._41, viewMatrix._42, viewMatrix._43, 1.0f );
}
output.position = mul(output.position, projectionMatrix);
output.tex = input.tex;
// Fog calc
output.fogFactor = saturate((fogEnd - cameraPosition.z) / (fogEnd - fogStart));
output.instance = InstanceID;
return output;
}
I am using a y-up system, if it matters.
Please note there are no issues with the shader outside of the billboarding so please no recommendations on other things I can do differently. I just want to know how to billboard within the context of what you see here.
Thanks..