我正在尝试在平面上进行法线贴图,但我无法得到任何明显的结果:(
我的着色器
对于我的眼睛,着色器看起来很好,但它没有呈现所需的结果(https://dl.dropbox.com/u/47585151/sss/final.png)。 所有的值都被传递。当我创建网格时,正确计算正常值,标记和正常值,我已经检查过了! 以下是环境,漫反射,高光和凹凸贴图的屏幕。
https://dl.dropbox.com/u/47585151/sss/ambient.png
https://dl.dropbox.com/u/47585151/sss/bumpMap.png
https://dl.dropbox.com/u/47585151/sss/diffuse.png
https://dl.dropbox.com/u/47585151/sss/specular.png
他们似乎合法......
凹凸贴图是(bump=normalize(mul(bump, input.WorldToTangentSpace))
的结果,看起来确实正确,但对最终结果没有任何影响。
也许我不理解不同的空间想法或者我改变了矩阵乘法的顺序。通过世界矩阵,我理解了网格的位置和方向,它永远不会改变,它是单位矩阵。只有视图矩阵变化并代表摄像机位置和在自己的空间中定位。
我的错误在哪里?
答案 0 :(得分:1)
首先,如果您遇到问题,那么将所有内容都评论出来是一个很好的意识形态,这不属于此。环境,镜面甚至漫反射纹理的整个光计算在这一刻并不令人感兴趣。与
output.color=float4(diffuse ,1);
如果您更改代码中的某些内容,您可以专注于您的问题并清楚地看到哪些更改。
如果你的四边形位于xy平面,z = 0,你应该改变你的光矢,他不会工作。通常我用于测试目的是对角矢量(如normalize(1,-1,1))以防止与我的对象平行方向。
当我查看你的代码时,在我看来,你没有得到不同空间的概念,就像你的想法一样;)正常映射的基本思想是提供关于表面的附加法线的附加信息。它们保存在法线贴图中,因此编码为rgb,其中b通常是向上矢量。现在你必须将它们放入你的3D世界,因为它们不在世界空间中,而是在切线空间中(切线空间=三角形的表面空间)。因为这种转换更复杂,所以正常计算则相反。你用法线,正常和切线作为矩阵变换你的光矢和从世界空间的观察者到切线空间(你将世界空间xyz的轴映射到tnb - 正切,正常,副正规,顺序可能是错的我通常交换它们直到它工作;))。你的行
bump = normalize(mul(bump, input.WorldToTangentSpace));
您尝试将切线空间中的法线变换为切线空间。更改此项,因此您将顶点着色器中的视图和光矢量转换为切线空间,并将变换后的矢量传递给像素着色器。在那里你可以在切线空间进行光计算。也许阅读正常映射的附加教程,然后你会得到这个工作! :)
PS:如果你已完成基本光照,你的镜面反射计算似乎也有一些错误。
float3 reflect = normalize(2*diffuse*bump-LightDirection);
这条线似乎应该计算中途向量,但是因此你需要viewvector而不应该使用像diffuse这样的lightstrength。但是教程可以比我现在更详细地解释这一点。