【问题标题】:OpenGL sheared near clipping planeOpenGL在剪裁平面附近剪切
【发布时间】:2021-10-25 07:45:27
【问题描述】:

我在 3d 空间中有四个任意点 (lt,rt,rb,lb),我希望这些点来定义我的近剪裁平面(lt 代表左上,rt 代表右上等等)。 不幸的是,这些点不一定是矩形(在屏幕空间中)。然而,它们是世界坐标中的一个矩形。

上下文是我想通过将镜像世界计算为纹理来获得镜面。镜子是 3d 空间中任意平移和旋转的矩形。 我不想更改顶点上的纹理坐标,因为这会导致丑陋的像素化,例如从侧面看镜子。当我这样做时,剔除也无法正常工作,这会导致对我的情况产生巨大的性能影响(小镜子,大世界)。

我也无法使用模板缓冲区,因为在某些情况下,我的镜像彼此面对,这也会导致性能大幅下降。此外,我想让我的渲染管道保持简单。

谁能告诉我如何计算相应的投影矩阵?

编辑:因为我已经相应地移动了我的相机。这不是这里的问题。

【问题讨论】:

  • 我不认为您可以将近裁剪平面更改为任何其他任意平面,只需使用投影矩阵即可。它始终是最小 Z 值。也许有办法做到这一点,但它仍然会弄乱你的深度缓冲区,因为最小剪切平面上的所有东西都必须有最小 Z。

标签: opengl projection clipping projection-matrix


【解决方案1】:

您应该定义一个额外的剪切平面,而不是调整投影矩阵(我认为在一般情况下无法做到)。您可以通过启用:

glEnable(GL_CLIP_DISTANCE0);

然后设置gl_ClipDistance顶点着色器输出为顶点到镜像的距离:

gl_ClipDistance[0] = dot(vec4(vertex_position, 1.0), mirror_plane);

【讨论】:

  • 我看不到如何使用此解决方案计算纹理中相应像素的颜色。
  • @user1994405 和剪辑有什么关系?
  • 什么都没有。倾斜剪裁效果很好。我要的是倾斜颜色和深度缓冲区,而不是倾斜剪裁。正如我所说,我只想将帧缓冲区用作纹理而不更改纹理坐标。
  • 也许,如果不使用@user253751 所说的模板缓冲区,它就无法工作。那将是不幸的,因为渲染无尽的反射会变得非常棘手。
  • @user1994405 嗯?我不明白你。您通常这样做的方式是使用与您的相机具有相同投影的模板缓冲区进行渲染,但世界(或相机)通过镜面镜像。至于多重反射——除了多次渲染之外,您无能为力。每次反射都会导致完全不同的投影(除非您有一些非常规则的几何形状,例如方形房间)。处理这个问题的正常方法是使你的反射变暗,这样你就可以简单地用纯色填充。
猜你喜欢
  • 2012-10-08
  • 2014-04-11
  • 2013-03-20
  • 2012-01-21
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多