我正在使用 Java 编写一个非常原始的 3D 图形引擎,该引擎基于 1995 年的 3D 游戏编程的黑色艺术。我已经到了可以在屏幕上绘制单色多边形并在“场景”周围移动相机的地步。我什至有一个 Z 缓冲区,它可以通过按 Z 对这些像素进行排序来正确处理半透明对象,只要我一次不显示太多半透明像素。我正处于要添加照明的地步。我想保持简单,环境光看起来很简单,定向光也应该相当简单。但我真的想要点光源,它能够移动光源并投射出非常原始的阴影(大多数情况下我不希望光线穿过墙壁)。
我的问题是我不知道解决这个问题的最佳方法。我想象一个点光源以规则的角度投射光线,如果这些光线与多边形相交,它将照亮该多边形并停止向前移动。但是,当我考虑一个具有多个光源和多个多边形以及所有这些光线的场景时,我想它会变得非常慢。我也不知道如何处理多边形距离光源足够远而落在两条光线之间的情况。我会给每个光源一个最大距离,如果我给它足够的光线,那么在这个距离内不应该有任何两条光线相距太远而错过多边形的点,但这只会增加我的问题数量要执行的计算。
我的问题是:是否有一些技巧可以点光源来加快它们的速度,或者只是为了更好地组织它?恐怕我只会做一个嵌套 for 循环的噩梦。我不能使用 openGL 或 Direct3D 或任何其他作弊,因为我想自己编写。
如果你想看我到目前为止的结果,这里是一个 youtube 视频。我已经修复了坏的相机旋转。http://www.youtube.com/watch?v=_XYj113Le58&feature=plcp