我正在使用Java从1995年开始基于3D游戏编程的黑色艺术编写一个非常原始的3D图形引擎。我已经到了可以在屏幕上绘制单色多边形并将相机移动到“现场”。我甚至有一个Z缓冲区可以通过Z对这些像素进行排序来正确处理半透明对象,只要我一次不显示太多半透明像素。我正处于想要添加照明的地步。我想保持简单,环境光看起来很简单,定向光也应该相当简单。但我真的希望点光源能够移动光源并投射出非常原始的阴影(大多数情况下我不希望光照在墙壁上)。
我的问题是我不知道解决这个问题的最佳方法。我想象一个点光源以规则角度投射光线,如果这些光线与多边形相交,它将点亮该多边形并停止向前移动。然而,当我想到一个具有多个光源的场景和多个具有所有这些光线的多边形时,我想它会变得非常慢。我也不知道如何处理多边形远离光源的情况,如果光线落在两条光线之间。我会给每个光源一个最大距离,如果我给它足够的光线,那么在那个距离内应该没有点任何两条光线相距太远而不能错过多边形,但这只会增加我的问题。计算要执行。
我的问题是:是否有一些技巧可以指出光源加速它们或只是为了更好地组织它?我担心我会遇到一个嵌套for循环的噩梦。我不能使用openGL或Direct3D或任何其他作弊,因为我想写自己的。
如果您想查看我到目前为止的搜索结果,这里有一个YouTube视频。我已经修复了坏的相机旋转。 http://www.youtube.com/watch?v=_XYj113Le58&feature=plcp
答案 0 :(得分:0)
实时3D应用程序的照明是(或者更确切地说 - 过去一般来说)通过非常简单的近似来完成 - 请参阅http://en.wikipedia.org/wiki/Shading。阴影很昂贵 - 并且通常在光栅化3d引擎中通过shadow maps& Shadow Volumes。点光源使阴影更加昂贵。
动态实时光源最近才成为游戏中的常见功能 - 仅仅因为它们给渲染系统带来了沉重的负担。这些游戏利用专用显卡。因此,如果您决定使用动态阴影投射点光源,我认为您可能很难从引擎中获得良好的性能。
今天,以两种方式应用照明是很常见的:
有很多选择。然而,实现比过去几年专用图形卡使用的基本模型复杂得多的任何东西都将具有挑战性!
我的建议是从简单的事情开始 - 没有阴影的基本照明。从那里你可以扩展和优化。
你在做什么射线三角交叉测试?您是否只尝试点亮灯光会到达的三角形?雷三角 我认为,每个聚光灯的每个灯的交叉点都会非常昂贵。对于没有阴影的照明,通常你会 只是遍历每个面(或者如果你是按顶点,通过每个顶点),并计算&添加每个光源的光照贡献 - 您可以在开始光栅化之前执行此操作,因为您必须在任何情况下通过所有多边形。
您可以使用任何照明模型来计算光照,这种模型非常简单,例如Lambertian reflectance - 根据表面法线的点积和从表面到表面的方向矢量对表面进行着色。光。确保你的矢量在同一个空间!这可能就是为什么你得到了你的奇怪结果。如果曲面法线在世界空间中,请务必计算世界空间光矢量。在某些空间中调节照明有很多优点,稍后您可以查看,现在我建议您只需启动并运行基础知识。另请参阅Blinn-phong - 这是多年来使用的着色模型显卡。
对于带阴影的照明 - 请查看我发布的链接。它们的开发是因为实际照明计算起来非常昂贵。
顺便说一句,LaMothe有一本名为“3D游戏编程大师 - 高级3D图形和光栅化技巧”的后续书。
这将指导您完成编程3d引擎的每一步。我不确定黑色艺术书的内容。