Проблема с шейдером / кодом - PullRequest
       54

Проблема с шейдером / кодом

1 голос
/ 06 октября 2010

У меня есть это базовое 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)
    };
}

Инициирование треугольника, который я пытаюсь нарисовать:

  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 Ответ

1 голос
/ 06 октября 2010

В 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, вы также можете прочитать это сообщение в блоге .

...