opengl - 镜像着色器的可能性?

时间:2014-12-29 21:49:04

标签: c++ opengl glsl shader mirror

直到今天,当我想在opengl中创建反射(镜子)时,我将视图渲染到纹理中并在镜像表面上显示该纹理。

我想知道的是,在opengl中有没有其他方法来创建镜像

并且2.可以在着色器中孤独(例如几何着色器)吗?

2 个答案:

答案 0 :(得分:6)

射线跟踪。您可以在片段着色器中编写光线跟踪器(每个片段都跟随光线)。射线追踪器可以完美地处理各种表面上的反射(镜像)。

您可以找到一个OpenGL示例here和一个包含镜像here的WebGL示例。

答案 1 :(得分:5)

在我所知道的任何3D API中,没有通用的方法可以做到这一点。 根据您的情况,有几种可能的技术有不同的缺点。

  • 平面反思:那你已经在做什么了。 请注意,您的镜子需要是平的,并且您必须剪切,以便比镜子更接近于渲染到纹理中。
  • 旧的cubemaps将立方体贴图附加到每个镜像,然后在反射方向上对其进行采样。这适用于任何表面,但您需要渲染立方体贴图(如果您不关心移动被反射的对象,则只能执行一次)。我不认为你可以在没有着色器的情况下做到这一点,但只有镜子需要一个。它是一种非常常见的技术,因为它易于实现,可以动态且相当便宜,同时易于集成到现有引擎中。
  • 屏幕空间光线游行:这是danny-ruijters建议的内容。有点像SSAO:对于每个像素,沿着反射向量采样深度缓冲区,直到你碰到某个东西。这具有适用于任何地方(在任意复杂表面上)的优点,但是它只能反映出现在屏幕上的东西,这些东西可以引入许多小的伪像但是它完全动态且非常容易实现。请注意,在计算反射时,您需要额外的传递(或将法线渲染到缓冲区中)来访问场景最终颜色。你绝对需要着色器,但它的后期处理因此它不会干扰场景渲染,如果这是你害怕的。 Some modern game engines使用此功能向反射表面添加小细节,而无需计算/存储立方体贴图的负担。

它们可能是许多其他渲染镜像的方法,但这些是树主要的(至少我所知道的)做反射的方法。