OpenGL ES - 如何创建发光平面

时间:2014-11-22 07:29:31

标签: android opengl-es

我是OpenGL ES世界的新手,并在Android OpenGL ES上学习一些关于3D图形的基础知识。我想知道如何创建一个发光的图像平面?这很容易在像Blender这样的三维模型软件中实现(使用Cycles Render),请参阅下图,了解我正在寻找的效果。通过一些研究,我了解到它们可能与使用着色器的Blur或Bloom效果有关。但我不太确定,我也不知道如何实施它们。

enter image description here

1 个答案:

答案 0 :(得分:1)

根据Paul-Jan的评论,你想要的东西远非OpenGL中的基础。

OpenGL的默认方法是前向渲染。即,每当您指定一块几何图形时,计算从三角形向前移动到像素,应用一个函数来确定每个像素的颜色,并将它们转发到帧缓冲区。所以起始位置是每个像素都没有周围世界的概念。每个都是孤立存在的。

在你的场景中,盒子下面的地板不知道它应该是蓝色的,因为它不知道它上面有一个盒子。

像Blender这样的程序使用不同的方法,在这种情况下可以准确地称为向后渲染。它从每个像素开始,询问它背后的几何形状。在这样做时,它明确地了解了场景中的所有几何体。因此,当它发现地板落在某个位置后面时,它可以继续并询问“地板可以看到哪些光源?”建立照明。

默认的OpenGL方法是为实时渲染而建立的。如果你看一下旧的视频游戏,你会发现整个地方的证据:物体通常不会相互投射阴影(或者这样的阴影是非常粗略的近似),只有一个光源是无限远的(就几何而言,它处于固定的位置;不需要真正了解场景)。

因此,解决方案是通过对整个场景的一些了解来投资几何体。常见的方法是从光源的角度执行场景的内部渲染。这会生成深度缓冲区。通过将光位置和深度缓冲器关闭到场景中的每个几何体,他们可以计算它们是否对光源可见。如果是这样,那么他们就会被它照亮。如果不是那么他们就不是。

另一种选择是延迟渲染;您可以对场景进行标准传递,在每个像素处填充深度,表面颜色,曲面法线等。因此,您可以从相机的角度将完整的场景信息分解为逐像素存储。然后你假装相机可以看到的一切都是有的。所以你只需要传递那个像素的缓冲区就能看出它们能够和不能看到的光源。您还可以让屏幕的不同部分仅通过宽相2d距离检查来考虑哪些灯光足够接近,这样可以节省时间。

在任何一种情况下,我们实际上都在讨论相对高级的OpenGL内容。