2010-10-06 2 views
1

У меня есть это базовое 3D-приложение и я пытаюсь написать свой собственный шейдер toon, но даже если я удаляю часть tooning, он все еще остается просто темным, когда я даю ему красный цвет.Проблема с шейдером/кодом

код шейдера:

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

формат пользовательских вершин:

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 треугольника я пытаюсь сделать:

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

ответ

1

В C#, struct поля упорядочены последовательно в памяти. Но порядок полей в вашей структуре не соответствует тому, что вы установили в VertexElements.

Оно должно быть:

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

(. Не уверен, что это единственная проблема в вашем коде, но это то, что торчал)

Если вы используете XNA 4.0, вы также можете читайте this blog post.

+0

Заработал благодарность за это – Xyro

Смежные вопросы