Quantcast
Channel: Community | MonoGame - Latest topics
Viewing all articles
Browse latest Browse all 6821

Skinned models not animating in migrated project

$
0
0

@monogany wrote:

I am almost done with migrating my XNA project, thanks to this great forum. I only have one major issue left: Skinned models do not animate. I have unskinned models that work as they should, and both types of models use common code for the animations, bone transforms and so on. So I suspect the error is in the skinned shader effect. I cannot debug the shader so I'm hoping for some troubleshooting ideas or other input.

 technique SkinnedRender
    {
        pass P0
        {
			VertexShader = compile vs_4_0 TransformVertex();
			PixelShader = compile ps_4_0 TransformPixel(); 
        }
    }

   
        // This is the output from our skinning method
    struct SKIN_OUTPUT
    {
        float4 position;
        float4 normal;
    };
    
        // This method takes in a vertex and applies the bone transforms to it.
    SKIN_OUTPUT Skin4(const VS_INPUT input)
    {
        SKIN_OUTPUT output = (SKIN_OUTPUT)0;
        // Since the weights need to add up to one, store 1.0 - (sum of the weights)
        float lastWeight = 1.0;
        float weight = 0;
        // Apply the transforms for the first 3 weights
	    for (int i = 0; i < 3; ++i)
	    {
		weight = input.weights[i];
		lastWeight -= weight;
		output.position += mul(input.position, MatrixPalette[input.indices[i]]) * weight; 
		output.normal += mul(input.normal, MatrixPalette[input.indices[i]]) * weight;
	    }
	    // Apply the transform for the last weight
	    output.position += mul(input.position, MatrixPalette[input.indices[3]]) * lastWeight;
	    output.normal += mul(input.normal, MatrixPalette[input.indices[3]]) * lastWeight;
		
        return output;
    };
    
	// This is passed into our pixel shader
    struct VertexShaderOutput
    {
	
          float4	PositionPS	: POSITION;		// Position in projection space
          float2	TexCoord	: TEXCOORD0;
        
          float4	PositionWS	: TEXCOORD1;
	      float3	NormalWS	: TEXCOORD2;
		
	      float2 DistanceFromViewer : TEXCOORD3; // NEW: for correct light occlusion!

	      float4 ScreenPosition : TEXCOORD4;     		
    };
    
	
VertexShaderOutput TransformVertex(in VS_INPUT input)
    {
	    VertexShaderOutput output = (VertexShaderOutput)0;

        // Calculate the skinned position
        SKIN_OUTPUT skin = Skin4(input); 
        		
        // This is the final position of the vertex, and where it will be drawn on the screen
        float4x4 WorldViewProjection = mul(World, mul(View, Projection));
        						
	    output.PositionPS = mul(skin.position, WorldViewProjection);               
        float4 worldNormal = mul(skin.normal, World);
        output.TexCoord = input.texcoord;        
      
        output.NormalWS = worldNormal;
        output.PositionWS = mul(skin.position, World); 
				
	    output.ScreenPosition = output.PositionPS; //pos_ps; /* for overlay rendering */
		
	
	    float4	uncorrectedPositionWS = mul(skin.position, UncorrectedWorld);
	
	    // use the uncorrected world matrix when computing the distance from the viewer. verify by comparing with billboards on the same line near the top/bottom parts of the screen.
	    float distanceFromViewer = saturate(1 - (uncorrectedPositionWS.y - WindowPosition.y) / ViewportSize.y);
				        
	    output.DistanceFromViewer.x = distanceFromViewer;

	    return output;
    }

Posts: 1

Participants: 1

Read full topic


Viewing all articles
Browse latest Browse all 6821

Trending Articles