百科问答小站 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




  

相关话题

  为什么没有一个游戏厂家能研究出好一点的武侠吃鸡游戏? 
  ISP给的100M带宽到底是怎么算的? 
  关于Qt性能的损失,有没有一个可以量化的概念? 
  如何计算Fps游戏弹孔分布? 
  有没有哪个时刻让你突然感觉到:「我的计算机专业白学了」? 
  中国游戏落后日美欧韩多少年? 
  我该不该到德国重读本科? 
  C/C++ 数组大小需要是2的倍数吗? 
  给内存条加个永不断开的移动电源,能不能变成读写速度飞快的U盘? 
  为什么纯虚函数不提供函数体语法?这样不是更方便么? 

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





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