Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 Games101 作业7 绕坑引路 (Windows)

Tagged: 

Viewing 5 reply threads
  • Author
    Posts
    • #8706 Score: 4
      Chen
      Participant
      4 pts

      作业7算是花费时间比较久的,最终得到了“基本科学”的渲染结果,把若干坑点列举希望能对后来的同学有所帮助。其中个别问题可能平台相关,但大多不是。作业7从最基础的向量库都是手写的,基本实现零外部依赖,所以跨平台算是诸作业里最方便的了。

      对于Windows有执念,并且近来Windows的开发者环境越来越好,一直坚持用Windows开发(打游戏),包括本课全部作业。不用虚拟机预配置好的环境肯定会有些麻烦,但对编译系统稍有了解也并不复杂。(或者你可以选择Linux最好的发行版——WSL)环境Mingw64-GCC11.1.0。

      助教关于精度的提示是有用的。应该是因为cornell box是由墙壁面组成的,使得包围盒高度为0,所以需要修改BBOX判交逻辑。实测给texit加上个epsilon再判tenter < texit是完全够用的。但我猜直接tenter <= texit应该也够用。落坑表现:显示为结果全黑或几乎全黑。

      另一个关于epsilon大小的提示也有效果,适当增大epsilon。个人几次试验后采用了0.00016f。落坑表现:墙面有横向黑色条纹。

      浮点数判等使用epsilon自不必说,另提到除以pdf通过加一个epsilon来避免除数为0的建议,这个个人不建议采用,有两个原因:1. 作业不要求更改材质采样方法,所以事实上用到的所有pdf基本都是一个常数,光源的是1/A,半球采样的是1/2Pi,不会为0;2. 可能与我们调大epsilon也有关,除数增加会影响能量守恒,等同于消去了一部分能量,使得最终结果偏暗。落坑表现:最终结果偏暗。

      注意到实现伪代码中,因为我们对直接光源已经进行过一次重要性采样了,因此间接光照中不应对直接光照再次采样,所以间接光照的轮盘赌采样中需要判断递归castray是否交的是non-emitting object,否则相当于对光源重复采样,破坏了能量守恒。落坑表现:结果图有大量噪点,很多偏向白色过曝;将castray输出截断到0-1间内结果表现接近正常。

      微表面材质实现比较麻烦文章比较冗长还以英文偏多但耐着性子难度不大。关于多线程这简直是为OpenMP量身打造的,render发射初始光线处简单的循环嵌套,循环间无同步要求(除了更新进度条),改个三四行就多线程跑满CPU了。现代编译器都包含了OMP支持。可惜中文OMP的材料太少了,有些问答站的高票救命答案还不准确,但英文的文档写得很好。

      原本的随机数生成器属实不行。每次调用都会新建一个random device试图从系统随机源抽随机数,然后初始化一个伪随机数生成器,然后再产生一个均匀分布的伪随机数,效率非常灾难。另有帖子提到Windows下MingW的random device是伪随机数,查证后:1. 在大约GCC9已经被修复了,现在会使用正确的系统随机源;2. 即使是伪随机数此处正确的使用(不要每次都新建一个rng)也不会有问题。临时的解决方法是把random device和mt设为thread_local,每个线程内只初始化一次,也避免了多线程race condition。不建议rand()的原因是印象里里面自带一个全局锁。当然这可能也不会构成本程序的性能瓶颈。

      最后编译时加-O3参数。开不开O3或者说换不换release模式编译出来的是两种程序。否则STL的性能还没临时手写的库好。

      最终SPP 1024 784*784 microfacet材质,i7-11370H 4C 16G 渲染用时7min4sec。SPP 512与之没啥差别,SPP 16验证够用。

      This post has received 4 votes up.
      Attachments:
      You must be logged in to view attached files.
    • #8709 Score: 0
      Chen
      Participant
      4 pts

      一个不太满意的地方是物体背阴处着色不均匀,色彩与黑色点状分布。怀疑和精度也有关系。不知道有没有更好的方法。

    • #10013 Score: 0
      lav
      Participant
      -1 pt

      你的ggx的roughness用的是多少

    • #11036 Score: 1
      suicca
      Participant
      1 pt

      关于openmp并行可以看这个文档
      https://tildesites.bowdoin.edu/~ltoma/teaching/cs3225-GIS/fall17/Lectures/openmp.html

      操作非常简单:
      在你需要并行化的for前面,加上
      #pragma omp parallel for
      然后在cmake中加上
      set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -O3 -fopenmp")
      重新执行cmake ..然后编译即可。
      上面的-O3也可以提速。

      This post has received 1 vote up.
      • This reply was modified 2 years ago by suicca.
    • #12164 Score: 0
      wunianguiguolu
      Participant

      请问为什么会出现以下报错?把castray()改成return 0;无报错。

      Attachments:
      You must be logged in to view attached files.
    • #12866 Score: 0
      940233662
      Participant

      有黑点是eval和pdf函数的出射入射方向向量参数填反了

Viewing 5 reply threads
  • You must be logged in to reply to this topic.