百科问答小站 logo
百科问答小站 font logo



如何开始用 C++ 写一个光栅化渲染器? 第1页

  

user avatar   Unc-P 网友的相关建议: 
      

2018.09.05:

以我秋招面试经验来看,除非从事游戏相关的工作,这个项目对于找工作没什么用处,但它确实很有意思。所以如果你是为了简历上写项目时有亮点,同时你又不搞游戏,渲染器不是一个放在简历上的好项目。



原回答:


这是我正在写的路径追踪器,C++11/14实现,Linux环境(Ubuntu 16.04),写了有4个月了。很喜欢图形学,感觉特别有意思。

UncP/Giraffe,它的中文名字是长颈鹿,与Graphics有那么一点谐音。

在写光线追踪器之前写过一个很小的渲染器,很不满意自己的实现所以开始写Giraffe这个光线追踪器。渲染器!=光线追踪器,但是渲染器和光线追踪器有很多共通的地方,虽然一个面向物体,一个面向像素。渲染器里面的Z-Buffer在光线追踪器里其实是不断更新的距离。其余的坐标系变换、光照、纹理映射、相交检测是一样的。光线追踪器实现起来更加优雅但缺点是运行速度稍慢。

走了不少弯路,看了很多资料,尝试了很久,现在完成了

  • 多种表面的BSDF
  • 全局光照
  • 路径追踪
  • 蒙特卡洛积分
  • Russian Roulette
  • 纹理(Solid,Procedural,Cellular)
  • 反走样
  • Depth of field
  • 光源(点光源,方向光,区域光,纹理光)
  • 物体(平面,三角形,球,四棱柱,圆柱,圆盘)
  • 加速数据结构(BVH)
  • Giraffe光线追踪语言



这个光线追踪器我会一直写下去因为图 形 学 太 好 玩 了 !

别看我列了这么多但是如果你想深入学习离线渲染的话我建议先去接触各种算法——PT,LT,BPT,MLT,PM,SPPM,Radiosity…

以下是光线追踪器的部分效果图。



下面三张是最近跑的。

这张是长颈鹿(虽然不怎么像,花纹使用了Worley Noise)




我觉得图形学代码写起来非常舒服,模块间的耦合度非常低,尤其是当把基本框架搭起来之后,每次实现新的特性完全不需要进行模块测试,直接跑就行(这只是个人感觉,仅供参考)。


推荐一些参考资料(只有英文资料):
smallpt: Global Illumination in 99 lines of C++,这是一个只有99行的光线追踪器。

Scratchapixel,这是一个图形学网站,每章都有两三百行的C++11编写可以直接编译运行的图形学代码,非常适合入门。

第一第二个比较简单,耐心点慢慢来,如果有一定基础了一定要去下面这个CMU的课程主页,真的很棒(从渲染到光线追踪再到动画模拟)!

15462.courses.cs.cmu.edu
15年CMU的15-462,别去16年的,16年质量比较低。

Computer Graphics
15年MIT的6.837。
这两个图形学课程的主页上有课程PPT,参考书,还有很多辅助代码(空间几何,图片I/O等等)。

GitHub - mmp/pbrt-v3: Source code for pbrt, the renderer described in the third edition of "Physically Based Rendering: From Theory To Implementation", by Matt Pharr, Wenzel Jakob, and Greg Humphreys.,著名的开源渲染器,是书《Physically Based Rendering》的具体实现。

《Realistic Ray Tracing》,一本讲光线追踪具体实现的书,每章后面都有代码,这本书的作者就是《Fundamentals of Computer Graphics》的作者。

《Real Time Rendering》,这本书可以作为一本百科参考书,可以在具体实现某个模块时去阅读一下相关章节。


路径追踪器的地址:Giraffe: Distributed Monte Carlo Path Tracer

另外这个路径追踪器不再更新,已升级为一个离线渲染器,地址在这:UncP/Zebra




  

相关话题

  如何向完全不懂编程的小伙伴解释「程序写死」? 
  想要自己做一款游戏,需要学习哪些知识? 
  是不是机器学习的框架都偏向 Python ?如果是,为什么? 
  快奔四的人了,开始学C++,是否太迟了? 
  为什么C++中virtual要翻译为虚函数? 
  C++游戏开发择业前景? 
  能否设计出不会导致近视的显示屏? 
  C++20 即将到来的 coroutine 能否与 Golang 的 goroutine 媲美? 
  网上说 Java 的性能已经达到甚至超过 C++,是真的吗? 
  工程上存在那么多不确定情况,为什么计算机不能利用它们产生真随机数,而只能根据逻辑产生伪随机数? 

前一个讨论
为什么当年 Apple 可以从 PowerPC 顺利转换到 Intel 平台?
下一个讨论
你住过体验最好的酒店有哪些?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利