2010-10-06 75 views
1

我有這個基本的3D應用程序,並試圖寫我自己的香椿着色器,但即使我刪除了香椿的部分,它仍然只是保持普通darkblue,當我給它一個紅色。有着色器/代碼的問題

shader代碼:

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

三角形我想畫的初始化:

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 2010-10-06 16:22:51