2013-07-08 27 views
3

我使用three.js r.58中的正常着色器,我了解requires a normal map。但是,我正在使用动态位移贴图,所以在这种情况下,预先计算的法线贴图不起作用。用three.js r.58计算位移图的法线?

我发现的点亮位移贴图的所有示例都使用平面着色或预先计算的法线贴图。是否有可能基于移位顶点动态计算法线?

编辑:我已经张贴a demo of a sphere with a displacement map showing flat normals

Sphere with displacement but incorrect normals

下面就来跟我所有的例子说明这个问题的GitHub库的链接,以及解决方案,我最终发现: https://github.com/meetar/three.js-normal-map-0

+0

three.js中的法线贴图位于切线空间而不是对象空间。同时使用置换贴图和法线贴图应该没有问题。 – WestLangley

+0

我不想使用预先计算的法线贴图。如何根据位移贴图应用后的顶点自动计算法线? – meetar

+0

法线贴图用于添加细节。这听起来像你想要改变顶点法线的意思。这与切线空间法线贴图无关。 – WestLangley

回答

4

此答案基于您上面的意见。

你可以做你想做的事情,但它非常复杂,你当然必须修改three.js的'normal'着色器。

看一看http://alteredqualia.com/three/examples/webgl_cubes_indexed.html。看片段着色器,你会看到

vec3 normal = normalize(cross(dFdx(vViewPosition), dFdy(vViewPosition))); 

Alteredqualia在片段着色器,因为顶点位置在顶点着色器改变使用衍生正常的(而不是一个属性正常),和正常不众所周知。

他正在做的是使用片段位置的x和y屏幕空间导数的叉积来计算法线。

这将设置正常的脸部正常。在坚硬的边缘将是不连续的。

three.js所r.58

+0

非常酷!但它似乎仍然在计算预位移法线。这可能是我的片段着色器中的一个bug,但我需要做更多的测试。 – meetar

+0

1.您可以使用我在这里给出的答案,即时计算与移位顶点一致的面法线。您也可以将这些法线与正常的细节贴图结合起来。 2.切线空间法线贴图基本上应该是蓝色的。你的是白色的。对不起,我无法为你调试你的代码,但我可以回答关于three.js的问题。 – WestLangley