|
|
打算实现一个基于法线扰动的环境贴图,但是实现的效果让人很费解,已经困惑了两天了,请高人赐教,以下是HLSL代码:
float4x4 matWorldViewProj;
float4x4 matWorld;
float4 EyePos;
float time;
float4 Distortion;
texture CubeTex;
texture texNormal1;
texture texNormal2;
sampler Normal1 = sampler_state
{
Texture = <texNormal1>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
sampler Normal2 = sampler_state
{
Texture = <texNormal2>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
samplerCUBE CubeMapSampler = sampler_state
{
Texture = <CubeTex>;
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
struct VS_OUTPUT
{
float4 vPosition : POSITION;
float3 Reflect : TEXCOORD1;
float4 color : COLOR;
float2 tcBump0 : TEXCOORD2;
float2 tcBump1 : TEXCOORD3;
};
VS_OUTPUT VS(float4 Pos : POSITION, float3 Normal : NORMAL, float4 vColor : COLOR, float2 TexCoord : TEXCOORD0)
{
VS_OUTPUT output = (VS_OUTPUT)0;
output.vPosition = mul(Pos, matWorldViewProj);
float3 vPosW = mul(float4(Pos.x, Pos.y, Pos.z, 1.0), matWorld);
float3 I = normalize(vPosW - EyePos);
output.Reflect = reflect(I, Normal);
output.tcBump0.xy = frac(time * Distortion.xy) + TexCoord.xy;
output.tcBump1.xy = frac(time * Distortion.xy) + TexCoord.xy;
output.color = vColor;
return output;
}
float4 PS(VS_OUTPUT input) : COLOR
{
float3 vNormal1 = tex2D(Normal1, input.tcBump0).xyz;
float3 vNormal2 = tex2D(Normal2, input.tcBump1).xyz;
vNormal1 = vNormal1 * 2.0 - 1.0;
vNormal2 = vNormal2 * 2.0 - 1.0;
float3 vNormal = normalize(0.5*(vNormal1+vNormal2));
float3 ref = input.Reflect + 0.1*vNormal;
float4 ReflectColor = texCUBE(CubeMapSampler, ref);
float4 FinalColor = ReflectColor;
return FinalColor;
}
technique TShader
{
pass P0
{
VertexShader = compile vs_2_0 VS();
PixelShader = compile ps_2_0 PS();
}
}
这个是源程序 |
|