HLSL 着色器(Phong /w 法线贴图)
HLSL Shader (Phong /w normal map)
编辑:如果我使用法线贴图的计算,现在剩下的唯一问题是光线来自相反的方向。如果我只使用:
n = normalize(Input.NorView);
似乎没问题。
我开始使用 DirectX10 学习一些 HLSL 着色,并且我尝试使用法线贴图来计算我的 phong 闪电。首先,这里有一个例子来说明我走了多远:
https://i.stack.imgur.com/IFAo4.jpg
我不太确定这是否是我希望用这个法线地图完成的:https://i.stack.imgur.com/moQvf.jpg
我不知道。。这不应该看起来更像3Dish吗?也许我只是对法线贴图的用法有一个错误的理解,但在我的思维中,法线贴图是通过基于法线贴图添加阴影来使模型更详细,所以它看起来更 3D ish。
这是我的着色代码:顶点着色器:
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;
}
我也感觉到,当我使用法线贴图时,闪电正在改变方向,但我不确定。也许有人可以向我解释一下这件事。提前感谢任何帮助!
法线贴图不会创建阴影。 简单地说,它允许您重新评估每个纹素的照明。
似乎我计算的正常不正确,并且某些纹理也得到了错误的正常值。
相关文章:
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 如何在Visual Studio 2017中启动HLSL调试器?
- 在 texture2D 中绘制线条和字符(DirectCompute HLSL 编程)
- Unity 的 HLSL/Cg 预处理器工作方式错误?
- 如何在 HLSL 中定义具有大维度的数组
- 是否有任何 DirectX 11 (HLSL 5.0) 等效于 DirectX 9 纹理"string function"语法?
- 我可以以某种方式将 HLSL 放入 .lib 中吗?
- DirectX Toolkit加载了带有自定义HLSL着色器"顶点"着色器输入签名的模型
- HLSL 代码未注册
- 如何在HLSL DirectX11 C++中使用Texture2DArray
- DirectX HLSL 着色器隐式截断矢量类型错误
- 在 HLSL 中获取顶点的颜色
- 为结构体C++分配HLSL变量
- Direct X & HLSL - Normal ReComputing
- HLSL粒子系统将不显示
- HLSL 着色器(Phong /w 法线贴图)
- HLSL 几何着色器四边形正在移动
- 方法交叉在HLSL中是如何做的
- Phong Illumination in OpenGL website
- .用于 OpenGL 着色器的 HLSL 文件