【问题标题】:OpenGL ES - how to create a plane emitting lightOpenGL ES - 如何创建一个平面发光
【发布时间】:2015-01-20 09:54:02
【问题描述】:

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

【问题讨论】:

  • 您在该图像中看到的是全局照明,带有纹理矩形光源。或多或少与 基本 3D 图形相反,尤其是在 Android OpenGL ES 等有限环境中。

标签: android opengl-es


【解决方案1】:

根据 Paul-Jan 的评论,您想要的远非 OpenGL 的基本功能。

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

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

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

默认的 OpenGL 方法早已建立用于实时渲染。如果您查看旧的电子游戏,您会发现到处都是证据:物体通常不会相互投射阴影(或者这种阴影是非常粗略的近似值),只有一个无限远的光源(即,就几何而言,它处于固定位置;不需要真正了解场景)。

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

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

在任何一种情况下,我们实际上都是在谈论相对先进的 OpenGL 东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多