我一直在从屏幕空间转变为世界空间:
//convert the window coordinates from gl_fragCoord to NDC coordinates:
ndc.x = 2.0*((gl_FragCoord.x)/width-0.5);
ndc.y = 2.0*((gl_FragCoord.y)/height-0.5);
ndc.z = (2.0*gl_FragCoord.z-far-near)/(far-near);
//convert the NDC coordinates to clip coordinates - gl_FragCoord.w = 1/w_clip:
clip = vec4(ndc,1.0)/gl_FragCoord.w;
//convert the clip coordinates to eye coordinates:
eye = invproject*clip;
//convert eye coordinates to world space (with inverse view matrix)
objectpos = invmodel*eye;
这很好用,但问题是我正在尝试执行一些抗锯齿,我将屏幕坐标偏移som随机值,以便新坐标仍在屏幕像素内。我想这可以这样做:
ndc.x = 2.0*((gl_FragCoord.x+half_pixelsize*random.x)/width-0.5);
ndc.y = 2.0*((gl_FragCoord.y+half_pixelsize*random.y)/height-0.5);
ndc.z = (2.0*gl_FragCoord.z-far-near)/(far-near);
...
但问题是我仍然使用相同的z坐标,当改变屏幕空间中的坐标时,它应该在眼睛空间上有所不同。
我被告知这可以通过重新投影z坐标来处理:如果给出一个原始点,那么通过使用毕达哥拉斯,应该重新投射从原点到新点的距离。但我无法真正理解它的含义,或者是否有其他方法可以解决这个问题?