2010-10-06 5 views
1

J'ai cette application 3d de base et j'essaie d'écrire mon propre toon shader, mais même si j'enlève la partie toonation, elle reste toujours en bleu foncé quand je lui donne une couleur rouge.Problème avec le shader/code

code shaders:

struct VertexShaderInput 
{ 
    float4 Position : POSITION0; 
    float3 Normal : NORMAL0; 
    float4 Color : COLOR0; 

}; 

struct VertexShaderOutput 
{ 
    float4 Position : POSITION0; 
    float LightAmount : TEXCOORD1; 
    float4 Color : COLOR0; 
}; 

VertexShaderOutput VertexShaderFunction(VertexShaderInput input) 
{ 
    VertexShaderOutput output; 

    float4 worldPosition = mul(input.Position, World); 
    float4 viewPosition = mul(worldPosition, View); 
    output.Position = mul(viewPosition, Projection); 
    output.Color = input.Color; 
    float3 worldNormal = mul(input.Normal, World); 
    output.LightAmount = dot(worldNormal, LightDirection); 

    // TODO: add your vertex shader code here. 

    return output; 
} 

float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 
{ 
    float4 color = input.Color; 

    float light; 

    if (input.LightAmount > ToonThresholds[0]) 
     light = ToonBrightnessLevels[0]; 
    else if (input.LightAmount > ToonThresholds[1]) 
     light = ToonBrightnessLevels[1]; 
    else 
     light = ToonBrightnessLevels[2]; 

    color.rgb *= light; 

    return color; 
} 

format sommet personnalisé:

public struct VertexPositionNormalColored 
{ 
    public Vector3 Position; 
    public Color Color; 
    public Vector3 Normal; 

    public static int SizeInBytes = 7 * 4; 
    public static VertexElement[] VertexElements = new VertexElement[] 
    { 
     new VertexElement(0,VertexElementFormat.Vector3,VertexElementUsage.Position,0), 
     new VertexElement(12,VertexElementFormat.Vector3,VertexElementUsage.Normal,0), 
     new VertexElement(24,VertexElementFormat.Color,VertexElementUsage.Color,0) 
    }; 
} 

Init du triangle que je suis en train de dessiner:

testVetices = new VertexPositionNormalColored[3]; 
    testVetices[0].Position = new Vector3(-0.5f, -0.5f, 0f); 
    testVetices[0].Color = Color.Red; 
    testVetices[0].Normal = new Vector3(0, 0, 1); 
    testVetices[1].Position = new Vector3(0, 0.5f, 0f); 
    testVetices[1].Color = Color.Red; 
    testVetices[1].Normal = new Vector3(0, 0, 1); 
    testVetices[2].Position = new Vector3(0.5f, -0.5f, 0f); 
    testVetices[2].Color = Color.Red; 
    testVetices[2].Normal = new Vector3(0, 0, 1); 

Répondre

1

En C#, struct champs sont ordonnés de façon séquentielle en mémoire. Mais l'ordre des champs dans votre structure ne correspond pas à celui que vous avez défini dans VertexElements.

Il devrait être:

public struct VertexPositionNormalColored 
{ 
    public Vector3 Position; 
    public Vector3 Normal; 
    public Color Color; // oh look I've moved! 

    public static int SizeInBytes = 7 * 4; 
    public static VertexElement[] VertexElements = new VertexElement[] 
    { 
     new VertexElement(0,VertexElementFormat.Vector3,VertexElementUsage.Position,0), 
     new VertexElement(12,VertexElementFormat.Vector3,VertexElementUsage.Normal,0), 
     new VertexElement(24,VertexElementFormat.Color,VertexElementUsage.Color,0) 
    }; 
} 

(. Je ne sais pas si c'est le seul problème dans votre code, mais c'est ce que coincé)

Si vous utilisez XNA 4.0, vous pouvez également avoir une lecture de this blog post.

+0

A travaillé, merci de le faire – Xyro