【发布时间】:2014-06-24 19:59:30
【问题描述】:
我尝试使用OpenGL - How to calculate normals in a terrain height grid? 中描述的算法。我在我的顶点着色器中弹出它并使用一些 perlin 噪声函数对其进行测试,它的工作就像一个魅力,但是当我将它移植到 Java 时,它并没有那么好。
float nx = 0;
float ny = 0;
float nz = 0;
Vector3 P = new Vector3(vpx,vpy,vpz);
Vector3 off = new Vector3(1,1,0);
float hL = tryGetHeight(_mempoints2,P.x - off.x,P.z - off.z);
float hR = tryGetHeight(_mempoints2,P.x + off.x,P.z + off.z);
float hD = tryGetHeight(_mempoints2,P.x - off.z,P.z - off.y);
float hU = tryGetHeight(_mempoints2,P.x + off.z,P.z + off.y);
nx = hL - hR;
ny = hD - hU;
nz = 2.0f;
Vector3 v = new Vector3(nx,ny,nz);
v = v.nor();
nx = v.x;
ny = v.y;
nz = v.z;
顶点着色器中算法的结果:
我的缓冲区设置中算法的结果:
(抱歉,模糊,我在拍摄这些时正在测试一些景深。)
【问题讨论】:
-
您不会在 P.xy 而是 P.xz 的小位移处进行评估,因此您不沿着切平面构建评估补丁,因此其法线不是搜索的表面法线。
标签: java opengl opengl-es lighting terrain