2

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

我的着色器

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

我的错误在哪里?

4

1 回答 1

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);

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

于 2012-11-01T10:38:00.240 回答