Java 我的正常计算有什么问题?

Java 我的正常计算有什么问题?,java,opengl,opengl-es,lighting,terrain,Java,Opengl,Opengl Es,Lighting,Terrain,我尝试使用中描述的算法。我在我的顶点着色器中弹出了它,并使用了一些柏林噪声函数来测试它,它工作得很好,但是当我将它移植到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

我尝试使用中描述的算法。我在我的顶点着色器中弹出了它,并使用了一些柏林噪声函数来测试它,它工作得很好,但是当我将它移植到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;
顶点着色器中的算法的结果:

我的缓冲区设置中的算法的结果:

很抱歉模糊了,拍这些照片时我正在测试景深

顶点着色器中的算法的结果:

不应在任何着色器阶段计算法线。顶点着色器不具有关于相邻顶点的信息,几何体着色器是性能猪,细分着色器只能为局部细分提供法线。在片段着色器中进行屏幕空间的正常计算是很奇怪的。在CPU上预先计算法线,并将其作为另一个顶点属性传递

v=v.nor


nor函数与您认为的功能不同。它将向量规格化为单位长度。向量归一化=/=曲面法线计算。要计算法线,您必须计算局部坡度向量的叉积。

您在正确的轨道上。您试图计算的叉积是

   (1, 0, (R-L)/2)
 x (0, 1, (U-D)/2)
 -----------------
(-(R-L)/2, -(U-D)/2, 1)
哪个方向和向量方向相同

(L-R,D-U,2)
当你有

N = norm(L-R,D-U,2)
您的左、右、上、下曲面高度为

L = height(P.x - 1, P.y)
R = height(P.x + 1, P.y)
U = height(P.x, P.y + 1)
D = height(P.x, P.y - 1)

如果你看,你有一些错误的符号和不匹配的下标。

你不在p.xy的小位移处求值,而是在p.xz的小位移处求值,因此你不沿着切线平面构建求值面片,因此它的法线不是搜索的曲面法线。我同意你关于顶点着色器的评论。你有什么我可以参考的资源可以帮助你进一步解释正常的计算吗?@seesharper:这应该是一本很好的入门书:–那么我建议你买一本关于线性代数的本科教科书。您必须熟悉使用向量空间及其操作。当谈到计算机图形学的数学时,有太多关于它的书,以至于我完全不知道哪些是好的,哪些是坏的。作为一名图形编码员,最权威的文本是计算机图形学——Foley等人的《原理与实践》。它在2009年发布了一个新版本,我还没有购买。引用的glsl方法不需要相邻顶点。您可以在一个小的计算拓扑邻域P中计算高度贴图。从效率角度来看,建议将该结果烘焙到法线贴图中并重用该贴图。我认为这不是着色器代码-这是客户端代码请参见我的答案。@wcochran:OP明确提到在顶点着色器中进行的计算。我一开始就在回答中提到了这一部分。