[opengl笔记]2017年08月19日

来源:互联网 发布:linux的syslog开启 编辑:程序博客网 时间:2024/05/20 05:26
问题一:从深度值获取世界坐标
  1. vec4 getWorldSpacePositionFromDepth(
  2.         sampler2D depthSampler,
  3.         mat4 proj,
  4.         mat4 view,
  5.         vec2 screenUVs)
  6. {

  7.         mat4 inverseProjectionView =  inverse(proj * view);
  8.         float pixelDepth = texture(depthSampler, screenUVs).r * 2.0f - 1.0f;        
  9.         
  10.         
  11.         vec4 clipSpacePosition =  vec4( screenUVs * 2.0f - 1.0f, pixelDepth, 1.0);
  12.         
  13.         vec4 worldPosition = inverseProjectionView * clipSpacePosition;
  14.         worldPosition = vec4((worldPosition.xyz / worldPosition.w ), 1.0f);
  15.         return worldPosition;
  16. }
复制代码
我确定很多的例子也是这么干的。
但是结果位置歪曲了并且当从原点移动camera的时候变得更糟糕,破坏了光照。

回答一:
你应该用glfragcoord的z来计算或者预先算出z坐标
  1. Amyway( model * view) * projection = mat1
  2. Vertex * mat1 = a
  3. A.xyz = a.xyz / a.w
  4. A = a * 0.5 + 0.5
复制代码
A.z应该是索要的z值

回答二:
你的代码看起来运行的很慢,但是是比较好的解决方式。screenUVs是如何算出来的
你是否传递的是渲染场景的世界坐标?也许可以试试在CPU上计算inverse-view-proj并且传给着色器。
由深度恢复坐标一般在后处理/延迟着色系统较为常见,上个回答中glfragcoord是不能获取的,并且像素的世界坐标没有其它办法可以获取。


追问:
screenuvs是屏幕坐标上的0-1值,
当我使用一个明确的世界坐标下的缓存并且正确显示,我认为是读取到了正确的uv。
我使用了cpu inverse view proj但是并没有什么改变。
这很奇怪了,因为当相机很远时又正常了。
。。。。。
后来提问者找到了原因,原来是:
glDepthRangef被设置为0.1f and 1000.0f
设置为0.0f and 1000.0f.固定了位置重建。


回答三:
glDepthRangef用于NDC-》depth-texture transform,通常取值0-1,最好不要动它。


回答四:
引用了定义:
"The setting of (0,1) maps the near plane to 0 and the far plane to 1. With this mapping, the depth buffer range is fully utilized."
意味着无需改变。
原创粉丝点击