问题六十八: 着色模型(shading model)(0)——《Ray Tracing from the Ground Up》代码的移植

用ray tracing的方式来生成图形,主要是分两步:

1,几何建模。即为“光线撞击物体”,求得撞击点。

2,给撞击点着色。我们之前的做法是:根据被撞击物体的材质(材质的颜色、材质对光线的反射和折射)来设置撞击点的颜色。用到的反射、折射是:理想漫反射、理想镜面反射、理想镜面折射。至于“光源”,只是环境光(ambient light),没有特定的光源。

 

接下来,我们要做的是:

1,考虑材质的更为实际的反射、折射模型

2,考虑特定光源:平行光光源、面光源(含点光源)

 

主要参考的书籍为《Ray Tracing from the Ground Up》。所以,我们先将该部分的主要代码移植到Codeblocksproject上(纯属个人爱好,更习惯用Codeblocks)。

 

移植后的Codeblocks项目保存的文件名是“raytracegroundup_transplant1_chapter14_20170217”,网络链接如下:

http://download.youkuaiyun.com/detail/libing_zeng/9756504

 

68.0.1 代码移植后生成的图形

这个图形由两部分组成:

1,最后灰色的是一个垂直的plane;

2,35个不同颜色的球。

 

其中物体是理想漫反射模型的材质;有两部分光照:环境光(ambient light)和平行光光源。

 

68.0.2 模块图

需要学习的新的东西是:“2,给撞击点着色”。

其中又包含两大部分内容:

2.1, 材质的反射、折射模型:涉及影响反射折射光的比例及其方向的物理属性

2.2, 光照模型:涉及到达撞击点的光照的强度和方向

 

(光照的强度和方向)+(材质影响反射折射光的比例及其方向的物理属性)=(反射到相机的光的强度)

 

这里先说明一下:考虑光的频率,光就呈现不同的颜色。(频率对应颜色)


68.0.3 主要文件层级图



World:

就是“世界”,所有的物体、所有的光源、相机(眼睛)、生成图像的屏幕等等都是在World里面初始化的。可以将World看作程序的入口。

 

初始化完成后,则是“发出光线撞击物体了”。

“发出光线”:相机(pinhole)发出光线,经追踪器(ray_cast)

“撞击

Ray Tracing(光线追踪)是一种在计算机图形学中使用的技术,用于生成高度逼真的图像。它通过跟踪光线从视点开始的路径,来模拟光在场景中的运动,计算出光线与物体的交点以及光线在经过物体时的反射、折射等效果,并最终生成图像。 以下是光线追踪的基本步骤[^1]: 1. 从相机位置发出一条光线。 2. 确定该光线与场景中物体的交点。 3. 计算该交点处的光照强度,包括直接光照和间接光照。 4. 根据物体的表面特性,计算反射或折射光线的方向和强度。 5. 递归计算反射或折射光线的路径,直到达到最大递归深度或光线不再与物体相交。 6. 将所有光线的颜色值组合在一起,得到最终的图像。 下面是一个简单的 Python 代码示例,演示了如何使用 Pygame 和 PyOpenGL 库实现简单的光线追踪效果[^2]: ```python import pygame from OpenGL.GL import * # 初始化 Pygame 和 PyOpenGL pygame.init() display = (800, 600) pygame.display.set_mode(display, pygame.DOUBLEBUF | pygame.OPENGL) # 设置相机位置和方向 glMatrixMode(GL_MODELVIEW) glLoadIdentity() gluLookAt(0, 0, 0, 0, 0, -1, 0, 1, 0) # 设置场景中的物体 glColor3f(1, 1, 1) glBegin(GL_TRIANGLES) glVertex3f(-1, -1, -5) glVertex3f(1, -1, -5) glVertex3f(0, 1, -5) glEnd() # 定义光线追踪函数 def raytrace(x, y): glReadBuffer(GL_BACK) color = glReadPixels(x, y, 1, 1, GL_RGB, GL_FLOAT) return color # 创建主循环 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() # 绘制场景和光线 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glBegin(GL_LINES) glVertex3f(0, 0, 0) glVertex3f(0, 0, -5) glEnd() # 调用光线追踪函数 x, y = pygame.mouse.get_pos() w, h = display color = raytrace(w - x, h - y) # 输出光线追踪结果 print("Color at (%d, %d): %s" % (x, y, color)) # 更新 Pygame 显示窗口 pygame.display.flip() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值