首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL ES 2.0中的非预定义多光源

OpenGL ES 2.0中的非预定义多光源
EN

Stack Overflow用户
提问于 2012-09-28 16:25:54
回答 1查看 2K关注 0票数 1

在GLSL中有一篇关于多光源的文章。

灯光

但是,light0light1参数在着色器代码中描述,如果必须绘制照明弹射击,例如每个照明弹都有自己的位置、颜色和必须照亮周围环境。我们如何管理其他物体着色器处理未知的(嗯,有一个限制的最大照明弹在屏幕上)的位置,颜色的照明弹?例如,屏幕上会有8枚最大的照明弹,我必须通过8*2的制服,即使在这个时候它们不存在?

或者想象一下你制作的水平编辑器,用户可以放置灯具,其他对象如何“知道”新光源和渲染,然后新的灯已经添加?

我认为一定有聪明的解决办法,但我找不到。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-28 17:15:10

照明方程通常依赖于加性颜色。所以输出是光的颜色1加光的颜色2加光3的颜色等等。

OpenGL提供的帧内缓冲器混合模式之一是加性混合.因此,您画的任何新的颜色输出都将添加到缓冲区中的任何内容中。

因此,最天真的解决方案就是编写你的着色器来做精确的一盏灯。如果你有多盏灯,那么多次画场景,每次都有不同的提名线。这是多通渲染的一个例子。

更好的解决方案包括写着色器一次做2,4,8或任何光,比如说,15盏灯作为8光画,然后4光画然后2光画然后1光画,当你通过时,只包括每个光可触及的几何图形。这往往意味着要找到智能的方法,将灯光按地点分组。

编辑:稍微考虑一下,我应该补充说,延迟遮阳中还有另一个选项,尽管目前它在大多数GL设备上并不完全有用,因为输出缓冲区的选项有限。

假设理论上你可以精确地渲染你的几何图形一次,并存储你想要的每一个像素。所以你不只是输出一种颜色,你会输出,比如说,在3d空间中的一个位置,一个正常的,一个漫射的颜色,一个镜面颜色和一个镜面指数。然后,所有这些都在一个每像素的缓冲器中。

然后,您可以通过(i)计算投影到屏幕上时所能占用的最大空间(因此,一个与像素直接相关的2d矩形)来呈现每个光;以及(ii)将光呈现为该大小的单个四角体,对于从刚刚设置的缓冲区读取相关值的每个像素,并输出一个适当的亮颜色。

然后,你会做所有的实际几何在你的场景中只有准确一次,每额外的光将花费最多一个,全屏四角。

实际上,您不能真正做到这一点,因为您倾向于在ES中使用的输出缓冲区提供的存储空间太少。但你通常可以做的是渲染到一个32位的彩色缓冲器与附加深度缓冲器。所以你只需将深度存储在深度缓冲器中,然后计算出世界(x,y,z),再加上相机在光线着色器中的均匀位置。您可以将普通x和y的8位版本存储在颜色缓冲区中,以便花费16位,并在颜色缓冲区中计算z,因为您知道法线总是单位长度。然后,随机选择一个具体的例子,也许您可以在剩余的空间中存储16位版本的漫射颜色,可能在YCrCb中为Y存储额外的存储空间。

主要的缺点是硬件反混叠不像透明度和深度缓冲器那样引起太多的关注。但是,如果你达到了这样的程度,你可以节省大量的照明,它仍然可能是有意义的手动反走样,通过渲染一个大版本的场景,然后缩小它在最后通过。

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

https://stackoverflow.com/questions/12643829

复制
相关文章

相似问题

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