请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 1071|回复: 3

绝妙的clip plane算法 [复制链接]

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2010-11-25
积分
2327
发表于 2017-11-9 13:51:28 |显示全部楼层
最近在做 VR 渲染,发现水面在侧头时右眼图像不正常,而左眼一直是对的,具体就是clip plane好像错位了。
查了原因,左右眼差别主要也就是 eye matrix 和 projection matrix,最后发现是 projection matrix 的 20(第三行第一列),正常这个值应该为0,但在OpenVR里得到的矩阵该值左右眼分别为 0.05,-0.05,具体为什么这里会导致clip plane错位就不懂了,如果有谁知道,请不吝赐教。
搜clip plane相关,就发现还可以用修改 projection matrix 的方法,把 near plane 替换为 自己的 clip plane,叫 Oblique Frustum Clipping,最早看到的是 Oblique View Frustum Depth Projection and Clipping - Eric Lengyel, Terathon Software,但用了提供的代码效果并不对,又看到了 nvidia 上的另一个版本: Oblique Frustum Clipping( http://www.nvidia.com/object/oblique_frustum_clipping.html ),这次对了。有时候我真的很佩服某些家伙的创意与技术!这个方法没有额外消耗,反而是减少了 clip plane 的消耗,绝妙!

具体代码作了点修改,因为原函数在靠近水面时效果好像不对,不过即使修改了之后,在非常接近水面时折射和反射图仍然不正常,原因待查,也望大牛研究告知。
  1. void ClipProjectionMatrix(D3DXMATRIXA16 & matView, D3DXMATRIXA16 & matProj, D3DXPLANE & clip_plane)
  2. {
  3.     D3DXMATRIXA16 matClipProj;

  4.    
  5.     D3DXMATRIXA16 WorldToProjection;
  6.    
  7.    
  8.     WorldToProjection = matView * matProj;

  9.     // m_clip_plane is plane definition (world space)
  10.     D3DXPlaneNormalize(&clip_plane, &clip_plane);

  11.     D3DXMatrixInverse(&WorldToProjection, NULL, &WorldToProjection);
  12.     D3DXMatrixTranspose(&WorldToProjection, &WorldToProjection);


  13.     D3DXVECTOR4 clipPlane(clip_plane.a, clip_plane.b, clip_plane.c, clip_plane.d);
  14.     D3DXVECTOR4 projClipPlane;

  15.     // transform clip plane into projection space
  16.     D3DXVec4Transform(&projClipPlane, &clipPlane, &WorldToProjection);
  17.     D3DXMatrixIdentity(&matClipProj);


  18.     if (projClipPlane.w == 0)  // or less than a really small value
  19.     {
  20.         // plane is perpendicular to the near plane
  21.         m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj);
  22.         return;
  23.     }

  24. /* // 这是我做的修改,在靠近水面时效果不对,暂时注释掉了。
  25.     if (projClipPlane.w > 0)
  26.     {
  27.         // flip plane to point away from eye
  28.         D3DXVECTOR4 clipPlane(-clip_plane.a, -clip_plane.b, -clip_plane.c, -clip_plane.d);

  29.         // transform clip plane into projection space
  30.         D3DXVec4Transform(&projClipPlane, &clipPlane, &WorldToProjection);

  31.     }
  32. */
  33.     // put projection space clip plane in Z column
  34.     matClipProj(0, 2) = projClipPlane.x;
  35.     matClipProj(1, 2) = projClipPlane.y;
  36.     matClipProj(2, 2) = projClipPlane.z;
  37.     matClipProj(3, 2) = projClipPlane.w;

  38.     // multiply into projection matrix
  39.     D3DXMATRIXA16 projClipMatrix = matProj * matClipProj;

  40.     m_pd3dDevice->SetTransform( D3DTS_PROJECTION, &projClipMatrix);

  41. }
复制代码

点评

江义奇  海!外直播 t.cn/RxlBLRZ 禁闻视频 t.cn/RJJZmvp 这GFW防火墙,每年要花几百亿。网友评论:害怕人们知道真相,只有在信息封闭的环境中,才能实施“谎言变真理”的阴谋。看这个..   发表于 6 天前

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

注册时间
2010-3-27
积分
6101
发表于 2017-11-16 12:30:48 |显示全部楼层
渲染错误仅文字描述肯定不购,建议楼主传个图。

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2010-11-25
积分
2327
发表于 2017-11-17 12:45:06 |显示全部楼层
ljb 发表于 2017-11-16 12:30
渲染错误仅文字描述肯定不购,建议楼主传个图。

如有兴趣,可以看看运行效果:

https://github.com/awakening3d/windrain_trail

下载后,启动目录下的 WindsPlayer.exe。
1. File > Open,打开 stream.sce 场景
2. Option > Console,打开控制台
3. 在控制台里,敲 r_oblique_clip 1,打开 oblique clip
4. Option > Free View Mode,打开自由观察模式

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2010-11-25
积分
2327
发表于 2017-11-22 16:13:32 |显示全部楼层
新发现,导致 clip plane 错位的原因不是左右眼矩阵不同,因为先画右眼,那又是左眼画面不正常了。
真正原因应该是绘制一帧画面的过程中,改变了某些状态,这样画另外一帧画面时,就导致不正常了。

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-12-15 02:54 , Processed in 0.047044 second(s), 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部