Xna 法线贴图中没有凹凸

Xna 法线贴图中没有凹凸,xna,shader,hlsl,Xna,Shader,Hlsl,我试图在平面上进行法线贴图,但没有得到任何明显的结果:( 我的着色器 对于我的眼睛来说,着色器看起来很好,但它没有渲染所需的结果()。 所有的值都被传递。法线、Tengent和Binormal在我创建网格时被正确计算,我已经检查过了! 以下是环境光、漫反射、镜面反射和凹凸贴图的屏幕 他们似乎是合法的。。。 凹凸贴图是(bump=normalize(mul(bump,input.WorldToTangentSpace))的结果,它看起来确实正确,但对最终结果没有任何影响。 也许我不理解不

我试图在平面上进行法线贴图,但没有得到任何明显的结果:(

我的着色器

对于我的眼睛来说,着色器看起来很好,但它没有渲染所需的结果()。 所有的值都被传递。法线、Tengent和Binormal在我创建网格时被正确计算,我已经检查过了! 以下是环境光、漫反射、镜面反射和凹凸贴图的屏幕

他们似乎是合法的。。。 凹凸贴图是(
bump=normalize(mul(bump,input.WorldToTangentSpace))
的结果,它看起来确实正确,但对最终结果没有任何影响。 也许我不理解不同的空间概念,或者我改变了矩阵乘法的顺序。通过世界矩阵,我了解了网格的位置和方向,它永远不会改变,它是单位矩阵。只有视图矩阵改变,并表示相机在自己的空间中的位置和方向


我的错误在哪里?

首先,如果你有问题,这是一个很好的想法,可以把所有的东西都注释掉,这不属于这个。整个光计算与环境光、镜面反射甚至漫射纹理在此时都不有趣。与

output.color=float4(diffuse ,1);
如果您更改了代码中的某些内容,您可以将注意力集中在您的问题上,并清楚地看到发生了哪些更改

如果你的四边形位于xy平面上,z=0,你应该改变你的光向量,他不会工作。通常我使用对角线向量(如normalize(1,-1,1))进行测试,以防止平行于我的对象

当我查看您的代码时,在我看来,您并没有按照您的想法理解不同的空格;)法线贴图的基本思想是提供关于具有其他法线的曲面的附加信息。它们保存在法线贴图中,因此编码为rgb,其中b通常是上方向向量。现在必须将它们拟合到3D世界中,因为它们不在世界空间中,而是在切线空间中(切线空间=三角形的曲面空间)。由于此转换更为复杂,法线计算反过来进行。使用法线、副法线和切线作为矩阵,将光向量和视图向量从世界空间转换为切线空间(您正在将世界空间xyz的轴映射到tnb-切线、法线、副法线,顺序可能会错误,我通常会将它们交换,直到它工作为止;)。使用您的直线

bump = normalize(mul(bump, input.WorldToTangentSpace));
您尝试将切线空间中的法线转换为切线空间。更改此设置,以便将vertexshader中的视图和光向量转换为切线空间,并将转换后的向量传递给pixelshader。在这里,您可以在切线空间中进行光计算。可能需要阅读有关法线贴图的其他教程,然后您将获得正在工作!:)

PS:如果您完成了基本照明,您的镜面反射计算似乎也有一些错误

float3 reflect = normalize(2*diffuse*bump-LightDirection);
这条线似乎应该计算中间向量,但因此您需要viewvector,并且不应该使用类似漫反射的照明强度。但是一个教程可以比我现在更详细地解释这一点