我正在用ABAP写一个光线跟踪器,学习《从地面向上的光线跟踪》一书。光线跟踪器能够创建计算机生成的图像。如果你想知道我在这项工作背后的动机,看看我的第一个博客。在我的第二个博客中,我把第一个C++类转换成了ABAP,这是我的第一个射线追踪器的补丁。在转换的过程中,我设法解决了ABAP的一些语言特性缺陷,例如过载。
在第三篇博客中,我将运行最基本的光线跟踪器。这本书称之为骨架光线跟踪器。
我将解释光线跟踪器背后的基本概念,并给你我的实现中的代码示例来突出这一概念。
我还让你参与我如何努力获得渲染结果显示。
下图让你了解光线投射的工作原理。
亨里克,(2008). 射线追踪图。[在线图片]网址:Wikipedia[22。2017年9月]
在这个阶段,我的光线跟踪器将无法处理灯光、阴影和相机,这些是接下来章节的功能。
在这个博客之后,我将能够从窗口的位置渲染单个对象,这里称为"图像"。
下拉
那么光线跟踪器是如何工作的?这本书把它归结为:
(Kevin Suffen,2007,第46页)
我没有实现2,3,所以我跳过了这些,从根本上简化了9。
给我一个世界,并在此基础上构建东西!
全面实施
我的世界由一个球体组成。壮观的!
完全实现
我将通过定义200×200像素的窗口来观察世界。每个像素的高度和宽度为1个单位。
注意:像素不是点,而是空间中的正方形。它的区域由像素大小*像素大小来定义。
完全实现
下面的代码触发整个渲染过程。
完全实现
现在逐行触发计算。
完全实现
为我构建一条光线,它面向球体(i\u z=-1),并从距离世界原点100个单位的地方开始光线每个像素的中心。
完全实现
t和shade\u rec在这个版本的光线跟踪器中没有使用,但它将在未来的版本中使用。
现在我关心的是,光线是否击中球体(数据(命中))。
完全实现
如果光线击中球体,我会把像素染成红色,或者是黑色。
完全实现
第一次尝试:#-字符
在这一点上,我得到了一个像素颜色,但我该怎么显示呢?
在谷歌上快速搜索后发现,这可能比我预期的要难。
为了验证我的代码是否有价值,消费返利新模式,我转向了"老字号"方法。每当我击中球体时,我会在行/列位置写一个#-字符。
完全实现
然后它显示自己…
…作为一个鸡蛋。
完成渲染
第二次尝试:像素
好的,我的代码似乎可以工作。但是我真的需要能够显示具有特定RGB颜色值的像素。
我没有找到任何可以让我在x和y坐标处放置具有特定颜色的像素的东西。读了一篇旧博客后,我的直觉告诉我,这需要我付出更多的努力。
托马斯荣格为作者的问题提供了一个解决方案,这使我朝着正确的方向前进。
尽管我仍然在寻找一个简单的出路,这使我从两个方面解决了这个问题。我问社区,是否有人还拥有托马斯·荣格(thomasjungs)成熟的位图图像处理课程,他发表了这篇文章,云服务器特价,以回应帮助那个来自上面的家伙。我只希望复制和粘贴我需要的位图部分,大数据信息,并完成它。
当社区正在挖掘他们的SAP墓地,搜索一个10年前的类,我正在阅读如何:
正如托马斯提到的,维基百科有一篇关于位图文件格式的优秀文章,数据和大数据的区别,剖析了所有的部分,比如位图头的结构。这让我想到了我自己的抽象。
完全实现
在阅读了几篇关于如何使用Dynpro显示位图的文章(1、2、3和4)之后,我也能变出一些东西,这让我在显示部门完成了工作。
完全实现
等等…我的第一个渲染图像。
那是一个相当好的时刻对我来说…凌晨2:45?
我编写了粘合代码来编排必要的类,云服务器哪个好,这些类涉及到光线跟踪图像。
同时,我在自己的位图文件格式抽象类(ZCL\U ART\U bitmap)的帮助下,成功地在经典的Dynpro屏幕上显示像素颜色值。
我的光线跟踪器的基础工作正常。我现在可以开始为我的光线跟踪器添加功能了。我想要更多的东西,我会给你更多的东西。菜单上的下一个东西是同时渲染多个对象,也就是更多的球和更多的平面。安德烈