2013-08-08 2 views
0

Хорошо, поэтому эта проблема очень велика, и по той же причине я бы предпочел разместить как можно меньше кода, но, скорее, вы пришли с идеями относительно того, что это может быть. Я отправлю код, где я чувствую, что проблема может быть. Если вы хотите увидеть больше, просто спросите, и я предоставил его.Нормальное картографирование дает wierd результаты. (C# XNA)

Итак, я просто «украл» шейдер для своей игры. Я украл, что нашел учебник, который я сделал раньше, и просто скопировал конечный результат. Таким образом, я знаю, что шейдер должен работать, потому что я использовал его раньше.

У меня есть пользовательский класс сетки, а также настраиваемая структура вершин. Я никогда не делал структуру xertex до этого, так что я думал, что это проблема. Но у меня есть некоторые контраргументы, которые я позже нашел: Все их переменные кажутся правильными, и все работает, кроме отображения bump. Изменение кантажного и/или бинормального эффекта, по-видимому, не влияет на затенение, что-то никогда. Поэтому я думаю, что ошибка заключается не в том, как они накапливаются, а в том, как они используются.

http://imageshack.us/photo/my-images/838/w6kv.png/

Это выход я получаю. Имейте в виду, что это мотив вокселя. Как вы можете видеть, все ящики имеют одну и ту же внешнюю тень. Однако это нормальная карта:

http://imageshack.us/photo/my-images/268/r7jt.jpg/

Как вы можете видеть, что они не подходят вообще. Теперь это может быть одна из трех вещей, которые я вижу:

  1. Возможно, я установил шейдер в xna.
  2. Это также может быть что-то в структуре вершин
  3. Это также может быть способ, которым я называю фактическую функцию рисования.

Так вот код для этих трех вещей (а шейдерный а):

Shader Setup: ((Здесь я настроить данные для затенения и нарисовать сетку))

// Bind the parameters with the shader. 
BBS.Parameters["World"].SetValue(Matrix.Identity); 
BBS.Parameters["View"].SetValue(camera.viewMatrix); 
BBS.Parameters["Projection"].SetValue(camera.projectionMatrix); 

BBS.Parameters["AmbientColor"].SetValue(Color.White.ToVector4()); 
BBS.Parameters["AmbientIntensity"].SetValue(0.5f); 

Vector3 LD = new Vector3(0, 1, -1); 
LD.Normalize(); 

BBS.Parameters["DiffuseColor"].SetValue(Color.White.ToVector4()); 
BBS.Parameters["DiffuseIntensity"].SetValue(0); 
BBS.Parameters["LightDirection"].SetValue(LD); 

BBS.Parameters["EyePosition"].SetValue(new Vector3(0.0f, 2.0f, 5.0f)); 
BBS.Parameters["SpecularColor"].SetValue(Color.White.ToVector4()); 
BBS.Parameters["ColorMap"].SetValue(cubeTexture); 
BBS.Parameters["NormalMap"].SetValue(Content.Load<Texture2D>("images")); 


BBS.CurrentTechnique = BBS.Techniques["Technique1"]; 

for (int i = 0; i < BBS.CurrentTechnique.Passes.Count; i++) 
{ 
    //EffectPass.Apply will update the device to 
    //begin using the state information defined in the current pass 
    BBS.CurrentTechnique.Passes[i].Apply(); 

    //theMesh contains all of the information required to draw 
    //the current mesh 
    graphics.DrawUserPrimitives(PrimitiveType.TriangleList, Mesh.Vertices, 0, Mesh.NUM_TRIANGLES); 
} 

Vertex структура:

public struct VertexPositionNormalTangentBinormalTexture : IVertexType 
{ 
    public Vector3 Position; 
    public Vector3 Normal; 
    public Vector2 TextureCoordinate; 
    public Vector3 Tangent; 
    public Vector3 Binormal; 

    public static readonly VertexDeclaration VertexElements = new VertexDeclaration 
    ( 
     new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0), 
     new VertexElement(12, VertexElementFormat.Vector3, VertexElementUsage.Normal, 0), 
     new VertexElement(24, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0), 
     new VertexElement(32, VertexElementFormat.Vector3, VertexElementUsage.Tangent, 0), 
     new VertexElement(44, VertexElementFormat.Vector3, VertexElementUsage.Binormal, 0) 
    ); 


    VertexDeclaration IVertexType.VertexDeclaration { get { return VertexElements; } } 

    public static readonly int SizeInBytes = sizeof(float) * (3 + 3 + 2 + 3 + 3); 
} 

Shader:

// XNA 4.0 Shader Programming #4 - Normal Mapping 

// Matrix 
float4x4 World; 
float4x4 View; 
float4x4 Projection; 

// Light related 
float4 AmbientColor; 
float AmbientIntensity; 

float3 LightDirection; 
float4 DiffuseColor; 
float DiffuseIntensity; 

float4 SpecularColor; 
float3 EyePosition; 


texture2D ColorMap; 
sampler2D ColorMapSampler = sampler_state 
{ 
    Texture = <ColorMap>; 
    MinFilter = linear; 
    MagFilter = linear; 
    MipFilter = linear; 
}; 

texture2D NormalMap; 
sampler2D NormalMapSampler = sampler_state 
{ 
    Texture = <NormalMap>; 
    MinFilter = linear; 
    MagFilter = linear; 
    MipFilter = linear; 
}; 

// The input for the VertexShader 
struct VertexShaderInput 
{ 
    float4 Position : POSITION0; 
    float2 TexCoord : TEXCOORD0; 
    float3 Normal : NORMAL0; 
    float3 Binormal : BINORMAL0; 
    float3 Tangent : TANGENT0; 
}; 

// The output from the vertex shader, used for later processing 
struct VertexShaderOutput 
{ 
    float4 Position : POSITION0; 
    float2 TexCoord : TEXCOORD0; 
    float3 View : TEXCOORD1; 
    float3x3 WorldToTangentSpace : TEXCOORD2; 
}; 

// The VertexShader. 
VertexShaderOutput VertexShaderFunction(VertexShaderInput input) 
{ 
    VertexShaderOutput output; 

    float4 worldPosition = mul(input.Position, World); 
    float4 viewPosition = mul(worldPosition, View); 
    output.Position = mul(viewPosition, Projection); 
    output.TexCoord = input.TexCoord; 

    output.WorldToTangentSpace[0] = mul(normalize(input.Tangent), World); 
    output.WorldToTangentSpace[1] = mul(normalize(input.Binormal), World); 
    output.WorldToTangentSpace[2] = mul(normalize(input.Normal), World); 

    output.View = normalize(float4(EyePosition,1.0) - worldPosition); 

    return output; 
} 

// The Pixel Shader 
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 
{ 
    float4 color = tex2D(ColorMapSampler, input.TexCoord); 

    float3 normalMap = 2.0 *(tex2D(NormalMapSampler, input.TexCoord)) - 1.0; 
    normalMap = normalize(mul(normalMap, input.WorldToTangentSpace)); 
    float4 normal = float4(normalMap,1.0); 

    float4 diffuse = saturate(dot(-LightDirection,normal)); 
    float4 reflect = normalize(2*diffuse*normal-float4(LightDirection,1.0)); 
    float4 specular = pow(saturate(dot(reflect,input.View)),32); 

    return color * AmbientColor * AmbientIntensity + 
      color * DiffuseIntensity * DiffuseColor * diffuse + 
      color * SpecularColor * specular; 
} 

// Our Techinique 
technique Technique1 
{ 
    pass Pass1 
    { 
     VertexShader = compile vs_2_0 VertexShaderFunction(); 
     PixelShader = compile ps_2_0 PixelShaderFunction(); 
    } 
} 

ответ

0

Это не делается в правильном порядке:

output.WorldToTangentSpace[0] = mul(normalize(input.Tangent), World); 
output.WorldToTangentSpace[1] = mul(normalize(input.Binormal), World); 
output.WorldToTangentSpace[2] = mul(normalize(input.Normal), World); 

Это должно быть так:

output.WorldToTangentSpace[0] = normalize(mul(input.Tangent), World); 
output.WorldToTangentSpace[1] = normalize(mul(input.Binormal), World); 
output.WorldToTangentSpace[2] = normalize(mul(input.Normal), World); 

В противном случае, Ваши нормали будут масштабируются от мира пространства трансформации и приведем В очень ярких и очень темных пятнах (что похоже на вашу проблему).Кстати, видя, как вы заинтересованы в нормальном отображении для VOXEL двигателей, проверьте следующее, что я сделал:

http://www.youtube.com/watch?v=roMlOmNgr_w http://www.youtube.com/watch?v=qkfHoGzQ8ZY

Надежда Вы получить вдохновение и что вы завершить проект.

+1

Вы имеете в виду 'normalize (mul (input.Tangent, World))' (а не 'normalize (mul (input.Tangent), World)')? – YellPika

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