[opengl笔记]2017年08月19日

问题一:从深度值获取世界坐标
  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."
意味着无需改变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值