Home Forums GAMES在线课程(现代计算机图形学入门)讨论区 作业7的提高题踩得一些坑(慢更中)

Tagged: 

Viewing 13 reply threads
  • Author
    Posts
    • #5490 Score: 3
      Bear
      Participant
      -11 pt

      多线程:
      OpenMP 了解一下(所有的框框都在干活)

      This post has received 3 votes up.
      Attachments:
      You must be logged in to view attached files.
    • #5492 Score: 1
      Angus
      Participant
      23 pts

      大佬留给小弟们一些锻炼的空间,别更那么快😂

      This post has received 1 vote up.
      • #5493 Score: 0
        Bear
        Participant
        -11 pt

        我第一次听这么奇怪的要求——包龙星😂

        • This reply was modified 3 years, 11 months ago by Bear.
      • #5496 Score: 0
        Bear
        Participant
        -11 pt

        我也是希望大家能互相交流,闭门造车理解错自己都不会意识到。。。

    • #5495 Score: 1
      Bear
      Participant
      -11 pt

      微表面:
      1. 老师课上讲得微表面模型叫 Cook–Torrance, 是目前最常用的微表面模型.
      有下述两种形式
      – \frac{DFG}{\pi * dot(VN) * dot(NL)}
      – \frac{DFG}{4 * dot(VN) * dot(NL)}

      2. 上式中 F 为菲涅尔项,框架中有计算方法

      3. F, G 各自有不同的形式, 可以随意组合

      4. 时刻牢记微表面模型假设所有的微表面都是镜面反射

      This post has received 1 vote up.
      • #5498 Score: 0
        Bear
        Participant
        -11 pt

        其实我还见过 Cook–Torrance 的一种形式是这样:
        \frac{DFG}{\pi * cos(dot(VN)) * cos(dot(NL))}

        不知道这里取一个 cos 是为了什么,将值限定在 [-1, 1] 内?大家知道的话可以告诉我

    • #5497 Score: 0
      Bear
      Participant
      -11 pt

      5.由于微表面模型都是镜面反射,所以调大材质粗糙度,理论上此时就是漫反射了。。。但我感觉这样的漫反射得 spp 较大时才比较亮。。。所以可以用 Cook–Torrance 算镜面反射和折射,用 Lambert 算漫反射

    • #5501 Score: 0
      MrPhD
      Participant
      1 pt

      我也用的openMP,话说你512,ssp设置为32,要多久啊,我差不多54分钟

      • #5502 Score: 0
        Bear
        Participant
        -11 pt

        我用的服务器 40 线程。。。分辨率 784×784 spp32 3分钟

        • #5504 Score: 0
          maajor
          Participant
          3 pts

          学习一个,所以OpenMR和std::thread有啥区别?
          我查了下有个帖子https://stackoverflow.com/questions/23258037/openmp-vs-c11-threads
          说OpenMP减少了些线程切换的overhead。那么我们让开启的线程数等于物理线程数,不就一样了?

          我是直接用的std::future语法, 开O3, 4核8线程, 784/spp32,接近三分钟
          十分推荐编译开这个优化编译O3, CMAKE里加一句 set(CMAKE_CXX_FLAGS “-O3 -pthread”),这里我顺便加了std::thread

          • #5509 Score: 0
            Bear
            Participant
            -11 pt

            感谢分享

            我 C++11 就多线程没学。。。所以没敢自己打

            • #5510 Score: 0
              Bear
              Participant
              -11 pt

              实际上我编译的时候都忘了 Release 编译了。。。

              • #5511 Score: 1
                maajor
                Participant
                3 pts

                开了我估计还有个两三倍的提速

                直接写std::thread太痛苦了我就放弃了,std::future这个语法还挺好写的,推荐

                This post has received 1 vote up.
                • #5807 Score: 0
                  xuyonglai
                  Participant
                  3 pts

                  同学你好,之前从没接触过多线程,但我尝试用std::future写了一下,但是没有效果,请问你是在虚拟机环境下写的吗,你说到的四核八线程中的四核是怎么设置的?

                  • #5809 Score: 1
                    maajor
                    Participant
                    3 pts

                    你好,我机器是四核八线程的i7,这个是物理的不用设置的。我是原生ubuntu环境,不过跟虚拟机应该一样的。代码里开了8个线程,我就默认系统线程池自动分配到了一个物理线程做一个工作线程了。

                    C++我也不太熟,平常c#写的比较多。写std::thread老给我报类型错误,指针引用傻傻分不清,然后写std::future就能跑。望大佬讲解。

                    比如一段示例代码如下:

                    
                    someReturnType someFunction(parameterA, parameterB);
                    
                    std::vector<std::future<someReturnType>>> futures;
                    
                    // dispatch all thread
                    for(uint32_t i = 0; i < NUM_THREAD; i++)
                    {
                        auto fut = std::async(std::launch::async, someFunction, parameterA, parameterB);
                        futures.push_back( std::move(fut) );      
                    }
                    
                    // join all results
                    for(uint32_t i = 0; i < NUM_THREAD; i++)
                    {
                        auto result = futures[i].get();
                    }
                    

                    这里someFunction就是一个干活的函数,我dispatch了NUM_THREAD个的someFunction,它们就在不同线程跑了,参数列表的区别使得每个线程干的不一样。

                    This post has received 1 vote up.
                    • #5816 Score: 0
                      xuyonglai
                      Participant
                      3 pts

                      多谢,我再去试一试。

        • #7887 Score: 0
          mageda
          Participant

          我疑惑了,没开多线程 784×784 spp32 只用111s。。差点以为自己一次写对了多线程,后来发现压根没开起来多线程,最后32线程只用11s。。。

    • #5512 Score: 0
      mvp
      Participant
      2 pts

      Cook-Torrance还要计算折射吗,感觉这样就有点麻烦了(折射之后紧接的是漫反射吗,然后漫反射出来还要折射吗)

      • #5513 Score: 0
        Bear
        Participant
        -11 pt

        f_r = kd * f_diffuse(Lambert) + ks * f_cook

        然后算 f_cook 的时候根据是否是折射计算中间向量 h 的方法会有变化

        而且我用 1 – kd 算的 ks(这里的 kd 实际上就是颜色) 可能会有些问题,看看大家的情况

        最后我可能实现有问题发现用了折射之后大部分区域就白了。。。

        • #5514 Score: 0
          cmc233
          Participant
          6 pts

          为啥要考虑这么复杂?直接按microfacet的定义写就行?(如图

          Attachments:
          You must be logged in to view attached files.
          • #5516 Score: 0
            Bear
            Participant
            -11 pt

            复杂一点就是为了能支持的材质多点。。。

            请问能分享下你的场景数据和模型吗

            • #5518 Score: 0
              cmc233
              Participant
              6 pts

              这个球是直接用new Sphere(Vector3f(300, 100, 300), 100, metal)创建的,metal->ior取的20,也没定义kd和ks
              (我感觉microfacet和diffuse,specular是独立的,是一种新的材质定义,他的两种极端就是diffuse和specular,所以计算时并不用考虑kd,ks(PS,菲涅尔项有一种近似倒是用ks定义的),如果microfacet想定义颜色,应该是取3个不同的metal->ior来对应rgb(因为菲涅尔项和光的波长有关)
              至于为啥ior取的20(物理上金属一般都是1-2吧),我倒是尝试过1.5,但这时候就特别黑orz,当然,也有可能是我函数写的有问题orz,不过我在网上看用来测试microfacet的模型,ior定义也是10+,v-ray对金属的ior定义也是20+)
              ps,如果直接用new Sphere建球,最好改一下sphere里对光线和球相交的判断,直接用应该会造成大量黑色噪点(和spp无关,加大spp不能减少)

              • #5523 Score: 0
                Bear
                Participant
                -11 pt

                1. “我感觉microfacet和diffuse,specular是独立的”
                这句话肯定是不对的,只能说是以前实现漫反射和镜面反射用的是Lambert,Phong 那一套近似的着色模型,现在用的着色模型比较高级,但目标还是实现漫反射和镜面反射
                (而且像同一个 object 多种材质简单一点的确就是 Lambert 算漫反射,Cook–Torrance 算镜面反射折射)

                2. kd, ks 有另外的计算方式。只不过需要定义新的参数进行计算(Disney 那一套)

                3. 只看代码 Sphere 求交好像没啥 BUG。。。

                多谢回复

                • #5524 Score: 0
                  cmc233
                  Participant
                  6 pts

                  emmm,我这个独立指的是,有了microfacet就不用再算Lambert,Phong了,因为看你前面打算把他们加起来(可能我原话用的diffuse和specular让你误解了orz),所有材质的本质不都是brdf,即光怎么反射嘛233

                  • #5525 Score: -1
                    Bear
                    Participant
                    -11 pt

                    加还是要加的。。。

                    不然图里这种材质用两个 Cook–Torrance 算太费时了(漫反射材质有些许镜面反射)

                    This post has received 1 vote down.
                    • This reply was modified 3 years, 11 months ago by Bear.
                    Attachments:
                    You must be logged in to view attached files.
                    • #5528 Score: 0
                      cmc233
                      Participant
                      6 pts

                      不同材质模型加在一起当然能实现不同效果,可是,现在是要实现microfacet啊,而且,为啥一定要区分漫反射和镜面反射,对于microfacet来说,不就是崎岖的地和完全平滑的地吗

                    • #5529 Score: 0
                      cmc233
                      Participant
                      6 pts

                      为啥这张图里的材质不能直接当成microfacet?(虽然感觉microfacet在金属上用的多些

                    • #5530 Score: 0
                      cmc233
                      Participant
                      6 pts

                      我知道我俩沟通的问题在哪了。。。Cook-Torrance model和Microfacet model是两个不同的model,只是Cook-Torrance model的定义fr=kd*f_{Lambert}+ks*f_{cook−torrance}用到了microfacet,老师上课讲的microfacet只是单纯的microfacet吧

                      • #5531 Score: 0
                        Bear
                        Participant
                        -11 pt

                        这么一说就差不多解决了。。。

                        我一直强调的是为了稍微复杂一点的材质,漫反射项不能丢,甭管这项是用 Lambert 还是复杂的 Oren Nayar

                        老师所讲的确是通用的公式,这个公式最开始不也是从 Cook-Torrance 来的吗。。。所以应该说 Cook-Torrance 是一种微表面模型,还有其它的种类

                      • #5532 Score: 0
                        cmc233
                        Participant
                        6 pts

                        感谢科普,要不是这个讨论,我还不知道Cook-Torrance是啥orz

              • #5708 Score: 0
                xxrl
                Participant
                1 pt

                我想问一下 球的求交的坑点是不是在求解二元一次方程那, 框架里用的是 x1*x2 = c/a 来算的x2, 自己试验了一下算出来的x2 和 求根公式里算的x2有点差别.

                • #7494 Score: 0
                  东东
                  Participant

                  改了很久,求解二元一次方程部分是没有问题的,问题出在那两个if(t0<0)的语句,我通过把它修改成以下的语句消除了黑色的噪点.
                  if (t0 < 100 * EPSILON) t0 = t1;
                  if (t0 < 100 * EPSILON) return result;
                  (此时EPSILON的值是1e-4)

          • #5929 Score: 0
            sublimation
            Participant
            3 pts

            大佬好,我想请教一个问题,微表面的几何框架好像如何描述呢?是否可以直接显性采用三角形描述呢?
            就是关于mask和法向量分布的计算。

          • #5963 Score: 0
            Keneyr
            Participant
            7 pts

            大佬,为啥你用的球?直接用作业的模型不行吗?

            • #5981 Score: 0
              sublimation
              Participant
              3 pts

              球体现反射更适合?因为有光滑的弯曲?

    • #5544 Score: 0
      nightwatch
      Participant
      3 pts

      C++线程库其实挺好用的。多线程的主要注意点,一个是分开的线程渲染完了以后,加到framebuffer的时候要加锁,其次是updateprogress进度条函数要加锁,最后是get_random_float()这个函数要保证thread_local,不然每一个线程里面的伪随机序列是一样的。

      cook-torrance还没搞出来的菜鸡路过。

      • #5545 Score: 0
        Bear
        Participant
        -11 pt

        framebuffer 改掉索引计算方式就不用上锁了,上锁太费资源

    • #5551 Score: 0
      Bear
      Participant
      -11 pt

      6. 对于 PBR 的结果如果感觉颜色过亮过暗,可以使用 Gamma 校正试试

      • #5552 Score: 0
        MrPhD
        Participant
        1 pt

        我的生成结果非常亮

        • #5553 Score: 0
          Bear
          Participant
          -11 pt

          所以对最终的结果做个校正试试,我开始也是特别亮(用的 G 是变形的 Smith)

    • #5731 Score: 0
      nightwatch
      Participant
      3 pts

      cook-torrance模型在learnopengl的pbr一节有定义,看懂了DFG的定义直接翻译公式就行,效果很好。

    • #5808 Score: 0
      xuyonglai
      Participant
      3 pts

      我问一下OpenMP是怎么配置的,是不是需要修改cmakeList,然后在需要多线程的地方加#pragma omp parallel for,我是这样弄的,但是没有效果啊。

      • #5817 Score: 0
        yujin
        Participant

        你可能要改一下虚拟机的配置,多分配几个核。

        • #5830 Score: 0
          xuyonglai
          Participant
          3 pts

          分了4个核,从68分钟降到58分钟。。。。。也不知道到底openmp起作用了没

          • #5847 Score: 0
            Bear
            Participant
            -11 pt

            你看渲染时候CPU各个核使用率呗

          • #5880 Score: 0
            nightwatch
            Participant
            3 pts

            虚拟机这么慢的? 我15年的小破本,实机全核心只要十几秒就渲染完了,16spp,512×512。

            • #5882 Score: 0
              clarence
              Participant
              -2 pt

              请问你具体是怎么实现的?我用std::future渲染用了很久,同样是16spp,512×512。我CPU是i5 6500,按理说不应该有这样的表现。

              • #8587 Score: 0
                thistl
                Participant

                在Mac上,性能瓶颈是随机数算法get_random_float
                前面三行只调用一次就好了
                感觉random_device有IO
                参考https://www.cnblogs.com/jiading/p/11653911.html

    • #5818 Score: 0
      白大线
      Participant
      1 pt

      想问一下大家的EPSILON取到什么值,发现这个的取值对实验效果有很大的影响。特别是用Sphere来实验Microfaces效果时的差别分成大。

      Attachments:
      You must be logged in to view attached files.
      • #5881 Score: 0
        nightwatch
        Participant
        3 pts

        我也是在1e-2,球面才开始无自相交

      • #5889 Score: 0
        Yinda Xu
        Participant
        -1 pt

        请问如果只想用一项,即fr=ks*f_{cook−torrance}的话,ks大致应该取多少?我直接取1的话感觉渲染出来有点过曝,相当于全部反射了,没有能量衰减。
        下图SPP=16

        Attachments:
        You must be logged in to view attached files.
        • #5892 Score: 0
          Bear
          Participant
          -11 pt

          ks = F 试试

    • #5913 Score: 0
      tk100p
      Participant

      想知道具体是怎么样建立一个小球体,对c++的使用还是不太熟练。另外求微表面模型的brdf的时候,作业框架内Material.cpp的fresnel函数求得的kr就是F吗,最后结果是不是原来求的diffuse加上ks*f_{cook−torrance},这样的话结果会过曝。

      • #5925 Score: 0
        Bear
        Participant
        -11 pt

        kr 就是 F;

        过曝应该是个别现象,毕竟模型中的各项 G, D 等有着各种各样的实现方法

        将 ks = F 进行尝试; 同时可以尝试进行 Gamma 校正

        • #6420 Score: 0
          Keneyr
          Participant
          7 pts

          为什么要ks = F,F不是菲涅尔项吗?

    • #5942 Score: 0
      小狮子
      Participant
      1 pt

      加上BRDF后 ,噪点又开始变多了,而且在rougness = 0时 并没有很强的镜面感觉,这是不是必须用 GGX来做重要性采样才能有镜面的效果呢?

      • #5945 Score: 0
        Bear
        Participant
        -11 pt

        那你原来的 D 用的啥。。。

        • #5947 Score: 1
          小狮子
          Participant
          1 pt

          ssp-512,rougness=0.1
          我加上cook-torrance 输出结果,还是有很多白色的噪点,但原本只有 kd/π时 十分的干净。
          这里 mettalic = 0.6,rougness = 0.1,同时也没有很强的镜面效果

          This post has received 1 vote up.
          • This reply was modified 3 years, 11 months ago by 小狮子.
          • #5969 Score: 0
            SHERLOCK
            Participant
            -1 pt

            你解决噪点的问题了吗

          • #6026 Score: 0
            nightwatch
            Participant
            3 pts

            可能是对球面的采样不够。加spp到1024看看,或者做对球面的重要性采样,引导更多光线到球面上。

          • #6421 Score: 0
            Keneyr
            Participant
            7 pts

            镜面效果是指什么?是指对红色和绿色的反射效果比较强烈吗?
            如果是这样我感觉我的镜面效果也很差···
            请问你的问题出在哪?

            Attachments:
            You must be logged in to view attached files.
          • #6869 Score: 0
            hyt589
            Participant
            2 pts

            我也是这个效果 请问你最后解决了吗?

    • #7246 Score: 0
      Ma
      Participant

      想问一下各位大佬,我算出来的f_{cook−torrance}是负数的这个合理吗,而且都是很小的数值,主要是分母下的{4 * dot(VN) * dot(NL)} 基本上都是一正一负的。

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