使怪異的圖案真希望有人能幫助我在這裏 - 我很少無法解決的錯誤在C#中,因爲我有在它經歷了相當數量的,但我沒有很多去與HLSL。自定義HLSL着色跨越icosphere
鏈接到下面的圖像是相同的模型(上運行程序生成)的兩倍,使用我的自定義着色器,下面列出使用BasicEffect和第二時間的第一(白色)的時間。事實上,它與BasicEffect一起使用,我認爲這不是爲模型或類似的東西生成法線問題。
我已經包括了不同層次的細分,以更好地說明這個問題。值得一提的是,兩種效果都使用相同的照明方向。
https://imagizer.imageshack.us/v2/801x721q90/673/qvXyBk.png
這裏是我的shader代碼(隨意挑選它拆開,任何提示都非常歡迎):
float4x4 WorldViewProj;
float4x4 NormalRotation = float4x4(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);
float4 ModelColor = float4(1, 1, 1, 1);
bool TextureEnabled = false;
Texture ModelTexture;
sampler ColoredTextureSampler = sampler_state
{
texture = <ModelTexture>;
magfilter = LINEAR; minfilter = LINEAR; mipfilter = LINEAR;
AddressU = mirror; AddressV = mirror;
};
float4 AmbientColor = float4(1, 1, 1, 1);
float AmbientIntensity = 0.1;
float3 DiffuseLightDirection = float3(1, 0, 0);
float4 DiffuseColor = float4(1, 1, 1, 1);
float DiffuseIntensity = 1.0;
struct VertexShaderInput
{
float4 Position : POSITION0;
float4 Normal : NORMAL0;
float2 TextureCoordinates : TEXCOORD0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
float4 Color : COLOR0;
float2 TextureCoordinates : TEXCOORD0;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output = (VertexShaderOutput)0;
output.Position = mul(input.Position, WorldViewProj);
float4 normal = mul(input.Normal, NormalRotation);
float lightIntensity = dot(normal, DiffuseLightDirection);
output.Color = saturate(DiffuseColor * DiffuseIntensity * lightIntensity);
output.TextureCoordinates = input.TextureCoordinates;
return output;
}
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float4 pixBaseColor = ModelColor;
if (TextureEnabled == true)
{
pixBaseColor = tex2D(ColoredTextureSampler, input.TextureCoordinates);
}
float4 lighting = saturate((input.Color + AmbientColor * AmbientIntensity) * pixBaseColor);
return lighting;
}
technique BestCurrent
{
pass Pass1
{
VertexShader = compile vs_2_0 VertexShaderFunction();
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
有幾件事情要嘗試:1)確保正常化之前,在點產品中使用它。 2)法線和光線方向矢量需要指向點積(從表面出來)的相同方向。如果你的照明意圖是+ x方向,那麼在做點積之前,你需要將它排除到-x方向。 3)可能不是問題,但要確保'input.Normal'的第四個分量是0或'NormalRotation'矩陣不包含任何翻譯。 – megadan 2014-10-08 06:40:30
在點積中使用它之前,還要確保光線方向已標準化 – megadan 2014-10-08 15:14:49
第一句通過標準化法線立即解決了我的問題。可以花幾天時間俯瞰!非常感謝您的快速回復。如果您將此作爲答案發送,我會標記它。 – 2014-10-08 21:53:13