Home › Forums › GAMES在线课程(现代计算机图形学入门)讨论区 › 作业7的提高题踩得一些坑(慢更中)
Tagged: Participant
- This topic has 63 replies, 23 voices, and was last updated 3 years, 5 months ago by thistl.
-
AuthorPosts
-
-
大佬留给小弟们一些锻炼的空间,别更那么快😂
This post has received 1 vote up.-
我也是希望大家能互相交流,闭门造车理解错自己都不会意识到。。。
-
微表面:
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.-
其实我还见过 Cook–Torrance 的一种形式是这样:
\frac{DFG}{\pi * cos(dot(VN)) * cos(dot(NL))}不知道这里取一个 cos 是为了什么,将值限定在 [-1, 1] 内?大家知道的话可以告诉我
-
-
5.由于微表面模型都是镜面反射,所以调大材质粗糙度,理论上此时就是漫反射了。。。但我感觉这样的漫反射得 spp 较大时才比较亮。。。所以可以用 Cook–Torrance 算镜面反射和折射,用 Lambert 算漫反射
-
我也用的openMP,话说你512,ssp设置为32,要多久啊,我差不多54分钟
-
我用的服务器 40 线程。。。分辨率 784×784 spp32 3分钟
-
学习一个,所以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-
感谢分享
我 C++11 就多线程没学。。。所以没敢自己打
-
实际上我编译的时候都忘了 Release 编译了。。。
-
开了我估计还有个两三倍的提速
直接写std::thread太痛苦了我就放弃了,std::future这个语法还挺好写的,推荐
This post has received 1 vote up.-
同学你好,之前从没接触过多线程,但我尝试用std::future写了一下,但是没有效果,请问你是在虚拟机环境下写的吗,你说到的四核八线程中的四核是怎么设置的?
-
你好,我机器是四核八线程的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.-
多谢,我再去试一试。
-
-
-
-
-
-
-
magedaParticipant
我疑惑了,没开多线程 784×784 spp32 只用111s。。差点以为自己一次写对了多线程,后来发现压根没开起来多线程,最后32线程只用11s。。。
-
-
-
Cook-Torrance还要计算折射吗,感觉这样就有点麻烦了(折射之后紧接的是漫反射吗,然后漫反射出来还要折射吗)
-
f_r = kd * f_diffuse(Lambert) + ks * f_cook
然后算 f_cook 的时候根据是否是折射计算中间向量 h 的方法会有变化
而且我用 1 – kd 算的 ks(这里的 kd 实际上就是颜色) 可能会有些问题,看看大家的情况
最后我可能实现有问题发现用了折射之后大部分区域就白了。。。
-
为啥要考虑这么复杂?直接按microfacet的定义写就行?(如图
Attachments:
You must be logged in to view attached files.-
复杂一点就是为了能支持的材质多点。。。
请问能分享下你的场景数据和模型吗
-
这个球是直接用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不能减少)-
1. “我感觉microfacet和diffuse,specular是独立的”
这句话肯定是不对的,只能说是以前实现漫反射和镜面反射用的是Lambert,Phong 那一套近似的着色模型,现在用的着色模型比较高级,但目标还是实现漫反射和镜面反射
(而且像同一个 object 多种材质简单一点的确就是 Lambert 算漫反射,Cook–Torrance 算镜面反射折射)2. kd, ks 有另外的计算方式。只不过需要定义新的参数进行计算(Disney 那一套)
3. 只看代码 Sphere 求交好像没啥 BUG。。。
多谢回复
-
emmm,我这个独立指的是,有了microfacet就不用再算Lambert,Phong了,因为看你前面打算把他们加起来(可能我原话用的diffuse和specular让你误解了orz),所有材质的本质不都是brdf,即光怎么反射嘛233
-
-
不同材质模型加在一起当然能实现不同效果,可是,现在是要实现microfacet啊,而且,为啥一定要区分漫反射和镜面反射,对于microfacet来说,不就是崎岖的地和完全平滑的地吗
-
为啥这张图里的材质不能直接当成microfacet?(虽然感觉microfacet在金属上用的多些
-
我知道我俩沟通的问题在哪了。。。Cook-Torrance model和Microfacet model是两个不同的model,只是Cook-Torrance model的定义fr=kd*f_{Lambert}+ks*f_{cook−torrance}用到了microfacet,老师上课讲的microfacet只是单纯的microfacet吧
-
这么一说就差不多解决了。。。
我一直强调的是为了稍微复杂一点的材质,漫反射项不能丢,甭管这项是用 Lambert 还是复杂的 Oren Nayar
老师所讲的确是通用的公式,这个公式最开始不也是从 Cook-Torrance 来的吗。。。所以应该说 Cook-Torrance 是一种微表面模型,还有其它的种类
-
感谢科普,要不是这个讨论,我还不知道Cook-Torrance是啥orz
-
-
-
-
-
我想问一下 球的求交的坑点是不是在求解二元一次方程那, 框架里用的是 x1*x2 = c/a 来算的x2, 自己试验了一下算出来的x2 和 求根公式里算的x2有点差别.
-
东东Participant
改了很久,求解二元一次方程部分是没有问题的,问题出在那两个if(t0<0)的语句,我通过把它修改成以下的语句消除了黑色的噪点.
if (t0 < 100 * EPSILON) t0 = t1;
if (t0 < 100 * EPSILON) return result;
(此时EPSILON的值是1e-4)
-
-
-
-
大佬好,我想请教一个问题,微表面的几何框架好像如何描述呢?是否可以直接显性采用三角形描述呢?
就是关于mask和法向量分布的计算。 -
大佬,为啥你用的球?直接用作业的模型不行吗?
-
球体现反射更适合?因为有光滑的弯曲?
-
-
-
-
-
C++线程库其实挺好用的。多线程的主要注意点,一个是分开的线程渲染完了以后,加到framebuffer的时候要加锁,其次是updateprogress进度条函数要加锁,最后是get_random_float()这个函数要保证thread_local,不然每一个线程里面的伪随机序列是一样的。
cook-torrance还没搞出来的菜鸡路过。
-
framebuffer 改掉索引计算方式就不用上锁了,上锁太费资源
-
-
6. 对于 PBR 的结果如果感觉颜色过亮过暗,可以使用 Gamma 校正试试
-
我的生成结果非常亮
-
所以对最终的结果做个校正试试,我开始也是特别亮(用的 G 是变形的 Smith)
-
-
-
cook-torrance模型在learnopengl的pbr一节有定义,看懂了DFG的定义直接翻译公式就行,效果很好。
-
https://zhuanlan.zhihu.com/p/81708753
D, G 形式很多的,可以随便选
-
-
我问一下OpenMP是怎么配置的,是不是需要修改cmakeList,然后在需要多线程的地方加#pragma omp parallel for,我是这样弄的,但是没有效果啊。
-
yujinParticipant
你可能要改一下虚拟机的配置,多分配几个核。
-
分了4个核,从68分钟降到58分钟。。。。。也不知道到底openmp起作用了没
-
你看渲染时候CPU各个核使用率呗
-
虚拟机这么慢的? 我15年的小破本,实机全核心只要十几秒就渲染完了,16spp,512×512。
-
请问你具体是怎么实现的?我用std::future渲染用了很久,同样是16spp,512×512。我CPU是i5 6500,按理说不应该有这样的表现。
-
thistlParticipant
在Mac上,性能瓶颈是随机数算法get_random_float
前面三行只调用一次就好了
感觉random_device有IO
参考https://www.cnblogs.com/jiading/p/11653911.html
-
-
-
-
-
-
想问一下大家的EPSILON取到什么值,发现这个的取值对实验效果有很大的影响。特别是用Sphere来实验Microfaces效果时的差别分成大。
Attachments:
You must be logged in to view attached files.-
我也是在1e-2,球面才开始无自相交
-
请问如果只想用一项,即fr=ks*f_{cook−torrance}的话,ks大致应该取多少?我直接取1的话感觉渲染出来有点过曝,相当于全部反射了,没有能量衰减。
下图SPP=16Attachments:
You must be logged in to view attached files.-
ks = F 试试
-
-
-
tk100pParticipant
想知道具体是怎么样建立一个小球体,对c++的使用还是不太熟练。另外求微表面模型的brdf的时候,作业框架内Material.cpp的fresnel函数求得的kr就是F吗,最后结果是不是原来求的diffuse加上ks*f_{cook−torrance},这样的话结果会过曝。
-
kr 就是 F;
过曝应该是个别现象,毕竟模型中的各项 G, D 等有着各种各样的实现方法
将 ks = F 进行尝试; 同时可以尝试进行 Gamma 校正
-
为什么要ks = F,F不是菲涅尔项吗?
-
-
-
加上BRDF后 ,噪点又开始变多了,而且在rougness = 0时 并没有很强的镜面感觉,这是不是必须用 GGX来做重要性采样才能有镜面的效果呢?
-
那你原来的 D 用的啥。。。
-
我加上cook-torrance 输出结果,还是有很多白色的噪点,但原本只有 kd/π时 十分的干净。
这里 mettalic = 0.6,rougness = 0.1,同时也没有很强的镜面效果This post has received 1 vote up.- This reply was modified 4 years, 7 months ago by 小狮子.
-
你解决噪点的问题了吗
-
可能是对球面的采样不够。加spp到1024看看,或者做对球面的重要性采样,引导更多光线到球面上。
-
我也是这个效果 请问你最后解决了吗?
-
-
-
MaParticipant
想问一下各位大佬,我算出来的f_{cook−torrance}是负数的这个合理吗,而且都是很小的数值,主要是分母下的{4 * dot(VN) * dot(NL)} 基本上都是一正一负的。
-
AuthorPosts
- You must be logged in to reply to this topic.