繁体   English   中英

HLSL Shader(Phong / w法线贴图)

[英]HLSL Shader (Phong /w normal map)

编辑:看来,现在剩下的唯一问题是,如果我对法线贴图使用计算,则光线来自相反的方向。 如果我只使用:

n = normalize(Input.NorView);

似乎很好。

我开始学习一些DirectX10的HLSL阴影,并且尝试使用法线贴图来计算我的phong闪电。 首先,这是我走了多远的一个例子:

http://i.stack.imgur.com/IFAo4.jpg

我不太确定这是否是我希望通过此法线贴图完成的工作: http : //i.stack.imgur.com/moQvf.jpg

我不知道..这看起来不应该是3Dish吗? 也许我只是对法线贴图的用法有一个错误的了解,但是在我的心态中,法线贴图用于通过添加基于法线贴图的阴影来使模型更详细,因此它看起来更3D立体。

这是我的着色代码:Vertex Shader:

T3dVertexPSIn MeshVS(T3dVertexVSIn Input) {
    T3dVertexPSIn output = (T3dVertexPSIn) 0;
    float4 tempVar;

    output.Pos = mul(float4(Input.Pos.xyz, 1).xyzw, g_WorldViewProjection);

    output.Tex = Input.Tex;

    tempVar = mul(float4(Input.Pos.xyz, 1).xyzw, g_WorldView);
    output.PosView = tempVar.xyz;

    tempVar = mul(float4(Input.Nor.xyz, 0).xyzw, g_WorldViewNormals);
    output.NorView = tempVar.xyz;
    output.NorView = normalize(output.NorView);

    tempVar = mul(float4(Input.Tan.xyz, 0).xyzw, g_WorldViewNormals);
    output.TanView = tempVar.xyz;
    output.TanView = normalize(output.TanView);

    return output;
}

像素着色器:

float4 MeshPS(T3dVertexPSIn Input) : SV_Target0 {
    float4 output = (float4)0; //output color

    float3 N = normalize(Input.NorView);

    float3 T = Input.TanView;

    T = normalize(T - N * dot(N,T));
    float3 B = cross(T,N);

    column_major float3x3 mTBN= {T, B, N};
    float4 matDiffuse = g_Diffuse.Sample(samAnisotropic, Input.Tex);
    float4 matSpecular = g_Specular.Sample(samAnisotropic, Input.Tex);
    float4 matGlow = g_Glow.Sample(samAnisotropic, Input.Tex);
    float4 colLight = float4(1,1,1,1);
    float4 colLightAmbient = float4(1,1,1,1);
    float3 n = mul(g_Normal.Sample(samAnisotropic, Input.Tex).rgb * 2.0 - 1.0, mTBN);
    //float3 n = mul(float3x3(T,B,N), nT);
    //float3 n = normalize(Input.NorView);
    float4 I = g_LightDirView;
    float3 r = reflect(-I.xyz, n);
    float3 v = normalize(-Input.PosView);

    float cd = 0.5f, cs = 0.3f, ca = 0.1f, cg = 0.3f;



    output = cd*matDiffuse*saturate(dot(n,I.xyz))*colLight
            +cs*matSpecular*pow(saturate(dot(r.xyz,v)),10)*colLight
            +ca*matDiffuse*colLightAmbient
            +cg*matGlow;


    return output;
}

当我使用法线贴图时,我也有闪电正在改变方向的感觉,但我不确定。 也许有人可以向我解释一下这件事。 在此先感谢您的帮助!

法线贴图不会创建阴影。 简而言之,它允许您重新评估每个纹理像素的照明。

好像我在计算法线不正确,某些纹理也得到了错误的法线。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM