【问题标题】:No bumps in Normal Mapping法线贴图没有凹凸
【发布时间】:2012-10-26 11:54:56
【问题描述】:

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

我的着色器

http://pastebin.com/raEvBY92

在我看来,着色器看起来不错,但它并没有渲染出想要的结果(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)) 的结果,看起来绝对正确,但对最终结果没有任何影响。 也许我不理解不同空间的想法,或者我改变了矩阵乘法的顺序。通过世界矩阵,我了解网格的位置和方向,它永远不会改变,它是单位矩阵。只有视图矩阵会改变并表示相机位置和在自己的空间中定位。

我的错误在哪里?

【问题讨论】:

    标签: xna shader hlsl


    【解决方案1】:

    首先,如果您遇到问题,最好将所有内容都注释掉,这不属于这个。目前,环境、镜面反射甚至漫反射纹理的整个光照计算并不有趣。与

    output.color=float4(diffuse ,1);
    

    如果您更改代码中的某些内容,您可以专注于您的问题并清楚地看到发生了什么变化。

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

    当我查看您的代码时,在我看来,您并没有像您想的那样理解不同的空间;) 法线贴图的基本思想是提供有关具有附加法线的表面的附加信息。它们保存在法线贴图中,因此编码为 rgb,其中 b 通常是向上向量。现在您必须将它们放入您的 3D 世界,因为它们不在世界空间中,而是在切线空间中(切线空间 = 三角形的表面空间)。因为这种转换更复杂,所以正常计算反过来。您将法线、副法线和切线转换为矩阵,将光矢量和视图矢量从世界空间转换为切线空间(您将世界空间 xyz 的轴映射到 tnb - 切线、法线、副法线,顺序可能错误我通常交换它们直到它起作用;))。用你的线

    bump = normalize(mul(bump, input.WorldToTangentSpace));
    

    您尝试将切线空间中的法线转换为切线空间。更改此设置,以便将顶点着色器中的视图和光向量转换为切线空间,并将转换后的向量传递给像素着色器。在那里,您可以在切线空间中进行光照计算。也许阅读法线贴图的附加教程,然后你就会得到这个工作! :)

    PS:如果你完成了基本的光照,你的高光计算似乎也有一些错误。

    float3 reflect = normalize(2*diffuse*bump-LightDirection);
    

    这条线似乎应该计算中途矢量,但因此您需要视图矢量并且不应该使用像漫反射这样的光照强度。但是现在一个教程可以比我更详细地解释这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多