首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OpenGL中绘制镜像镜像?

如何在OpenGL中绘制镜像镜像?
EN

Stack Overflow用户
提问于 2013-12-11 05:57:42
回答 2查看 17.1K关注 0票数 4

根据我的理解,要在OpenGL中镜像,基本上是画场景,然后翻转所有的东西,然后再画一次,除了使它通过镜子可见外,从而在镜子中创建一个完美的翻转图像。但我看到的问题是,当这样做时,唯一能看到其他镜像的镜像是在前面的镜像之后呈现的镜像。因此,如果我呈现镜像1然后镜像2,镜像1不能看到镜像2,但是镜像2可以看到镜像1。如何有效地镜像镜像而不发生呢?

EN

回答 2

Stack Overflow用户

发布于 2013-12-11 08:57:53

有两种常见的方法可以将反射呈现为多个/递归反射.

  1. 呈现给纹理,并将该纹理应用到镜像表面。 这样做的一个优点是,您可以使用来自前一帧的其他镜像的镜像纹理。虽然这引入了较小的延迟,但当您想要通过许多镜像查看时,它不会影响性能。如果这是一个问题,你可以重新渲染到反射纹理前几次主要相机渲染。 你也可以使用这种方法,如果镜子不是完美的平面,例如,这是很好的工作在水中的涟漪。事实上,这甚至可以用立方体映射来扩展,以支持近似的任意反射。
代码语言:javascript
复制
- [http://www.bonzaisoftware.com/tnp/gl-water-tutorial/](http://www.bonzaisoftware.com/tnp/gl-water-tutorial/) (overkill for planar reflections, but quite related)
- [http://ivanleben.blogspot.com.au/2008/03/water-reflections-with-opengl.html](http://ivanleben.blogspot.com.au/2008/03/water-reflections-with-opengl.html)
- [http://renderingwonders.wordpress.com/2011/01/03/chapter-08-%E2%80%93-buffer-objects-storage-is-now-in-your-hands-%E2%80%93-fbo-textures/](http://renderingwonders.wordpress.com/2011/01/03/chapter-08-%E2%80%93-buffer-objects-storage-is-now-in-your-hands-%E2%80%93-fbo-textures/)
- [http://cgvr.cs.uni-bremen.de/teaching/cg\_literatur/Cube\_map\_tutorial/cube\_map.html](http://cgvr.cs.uni-bremen.de/teaching/cg_literatur/Cube_map_tutorial/cube_map.html)

  1. Portal呈现,正如您所说的,使用模板缓冲区遮住镜像表面,在镜像平面周围翻转场景,然后重新渲染。 镜像渲染只是门户渲染的一个特例。这可以递归地完成,但是它变得非常复杂,因为您必须正确地管理深度缓冲区。您还将需要一个空间数据结构为您的场景,所以您不需要做一个完整的重新渲染,只呈现您可以通过镜子看到的东西(或者它变得非常慢)。如果你沿着这条路走下去,我建议慢慢来,包括大量的可视化调试,并使用一个简单直观的测试场景。

(关于单反射模板缓冲区的使用有很多页面,但这不是您想要的,所以我不想列出一些)

代码语言:javascript
复制
- [http://en.wikibooks.org/wiki/OpenGL\_Programming/Mini-Portal](http://en.wikibooks.org/wiki/OpenGL_Programming/Mini-Portal)
- [http://en.wikibooks.org/wiki/OpenGL\_Programming/Mini-Portal\_Recursive](http://en.wikibooks.org/wiki/OpenGL_Programming/Mini-Portal_Recursive)
- [http://www.fairyengine.com/articles/portals.htm](http://www.fairyengine.com/articles/portals.htm)
- [http://www.benjaminklingler.com/portal-rendering.html](http://www.benjaminklingler.com/portal-rendering.html)

*请注意,这些链接只是几分钟谷歌搜索的结果。请随意编辑和删除/添加。

票数 4
EN

Stack Overflow用户

发布于 2013-12-11 08:57:03

最简单的方法是使用模具缓冲区。看看这个页面

其基本思想是:

  • 你渲染镜子的表面并用1标记它。
  • 您可以重新呈现entrie场景,由镜像面镜像(您可以使用矩阵完成此操作),并且只在模板缓冲区为1的地方呈现(实际上只绘制镜像表面所在的位置)。
  • 使用不同的值重复,或清除其他镜像的模板缓冲区。如果你想让镜子反射其他的镜子,你需要画另一个镜面,在模板缓冲区中用2标记它,但只在它是1的地方。

如果你有反射镜,你必须做所有可能的组合(首先渲染镜子1,然后在镜像1的反射中镜像2,然后在原始场景中呈现镜像2,然后在镜像2的反射中呈现1的反射,等等)。

你不能用这个算法做无限镜像反射(只有有限的反射量)。只有射线追踪才能做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20511599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档