Forum Replies Created
-
AuthorPosts
-
msaa的计算量近乎是无抗锯齿的N倍(N个采样点的情况下),但是也不会出现很久的情况,在现代CPU的计算能力上应该是近乎秒出结果。
你会碰到一种叫作z-fighting的现象,表现出来就是两个三角形的内容不规则的交叉出现.
如果你规定这两个三角形深度完全一样,就一定会出现这个现象, 并且这种情况是无解的.渲染中碰见的z-fighting现象一般是因为浮点数精度不够,导致两个本来应该错开的三角形在计算后因为浮点误差而重叠. 这种情况的z-fighting是可以补救的: 使用更高精度的浮点数, 或者在计算深度前稍微移动一个小位移.
我先抛砖引玉一下,可以试着去把peter sherley的三本Ray tracing in one weekend看完,前两本书的内容课上应该都覆盖到了,第三本里面介绍了课上没讲的重要性采样。但是那本书也有缺点,可能是因为不是严肃的入门书,
全书都只有代码,没有理论推导的过程。PBRT在离线渲染上算是绕不开的一本书,比较全面,配图、文字精彩,而且代码质量很好。作者本身也在斯坦福上课,可惜这门课不是公开课,只能找到课件。更进阶的还请闫老师来回答了,想听闫老师对Rendering现状、前沿以及未来的看法和介绍。
This post has received 1 vote up.可能是对球面的采样不够。加spp到1024看看,或者做对球面的重要性采样,引导更多光线到球面上。
好奇这个GUI是用什么做的
你可以把图片切成几个小块,然后分给不同的线程,渲染完了以后合并到framebuffer里面去。我的i7 4820H, 512×512 128spp,开O3以后应该在40秒左右渲染完
亮度不够可能是因为光线弹射到了物体的表面里面(浮点误差,然后这条光线就没了,所以你在检测光线与物体相交的时候要注意避免和物体自相交。
This post has received 1 vote up.我也是在1e-2,球面才开始无自相交
虚拟机这么慢的? 我15年的小破本,实机全核心只要十几秒就渲染完了,16spp,512×512。
图片看起来好像是对的。 从直观的角度想一想,直接从光源采样,光线没有弹射的话,光源怎么能照亮和它同一个平面的天花板呢?
cook-torrance模型在learnopengl的pbr一节有定义,看懂了DFG的定义直接翻译公式就行,效果很好。
因为你只实现了直接采样光源,而且实现的还有点问题。右边的方块的右侧面应该是绿色的,这才能体现全局光照。
这是个标准的几何分布吧? 设rr的概率是p,停下来的概率是(1-p),数学期望是1/(1-p)。
This post has received 1 vote up.C++线程库其实挺好用的。多线程的主要注意点,一个是分开的线程渲染完了以后,加到framebuffer的时候要加锁,其次是updateprogress进度条函数要加锁,最后是get_random_float()这个函数要保证thread_local,不然每一个线程里面的伪随机序列是一样的。
cook-torrance还没搞出来的菜鸡路过。
比建树时间的话,naive版本的要优化后,用std::nth_element才能比,现在用的std::sort,上来就是O(nlogn)的复杂度。我用g++ O3的话,用你的模型,渲染时间差不多,基本上都是14秒,差别不是很大,12个bucket。
This post has received 1 vote down.大的方向rendering, modeling, simulation和animation. 其他的还有3d printing, virtual/augment reality, visualization子类的方向。
刘利刚老师有一篇好文”什么是计算机图形学?”,可以找来看看。virtualbox的拖放功能一直有这种不痛不痒的毛病
最好是开共享文件夹,好处还是有的,代码存在共享文件夹里,windows和linux都可以编辑。像素增加到一定阈值以后开始出现问题,下面的格子出现了跳格子着色的问题,猜测是浮点数导致的。稍微debug了一下
框架里的set_pixel传入的是浮点数point
void rst::rasterizer::set_pixel(const Eigen::Vector3f& point, const Eigen::Vector3f& color)
{
auto ind = (height-1-point.y())*width + point.x();
frame_buf[ind] = color;
}
第二行改成
auto ind = (height-1-int(point.y()))*width + int(point.x());
就可以了This post has received 1 vote up.这个话题已经超过这门课的内容了吧,属于cv/cg比较模糊的边界了
据我所知,前两年比较有影响力的工作应该是stanford做的BundleFusion。
效果youtube上有演示作业里面有提示呀。周围四个像素按距离插值颜色,与原有的像素颜色混合。思路基本上和作业2的抗锯齿差不多,还少了zbuffer的问题。
This post has received 2 votes down.我差点被你这个图绕进去了
简单的说,假如有两个向量V,两个不同的坐标系,a,b:
V_a = Transform_b * V_b
这个很容易理解,关键是这个Transform_b是怎么来的。Transform_b 是 b坐标系的三个坐标基,在a坐标系的表示。问题在这里,我们已知的t,b,n都是在世界坐标系下的t,b,n,是相对于世界原点而言的。所以这决定了推导公式的方向是从Local -> World来推导。
所以 local坐标系中的(1,0,0)对应世界坐标系的(tx,ty,tz)
即 [t,b,n] = T * I , 将局部坐标转成世界坐标系需要乘以TBNThis post has received 1 vote up.作业2的感觉是对的
Bug fix忘了合并进作业3吧1.当大家拿到代码框架的时候是如何理解框架?
无它,唯眼熟尔2.关于Eigen库的api调用问题,遇到一个api可能根本没用过,大家是如何获知这个api的使用方法的?
查eigen-quick-reference参考手册3.这个问题可能跟上面的问题有点相反,就是我想要一个功能的api,想知道Eigen库中有木有,怎么操作?
查参考手册
重点查Martrix和Geometry模块的手册就行了
或者在stackoverflow搜索4. 可能有时候并不知道有现成的api可以调用,大家是如何知道有哪些api可以调用的
C++标准库中数学有关的库主要是cmath和numericeigen带的功能请看第二点
5.当大家编译报错时,是如何定位问题根源的
eigen是模板库,在C++20的concept出来之前编译报错问题暂时得不到改善。
做作业都是填充几个函数,修改的代码量不多,多观察一般能看出来哪里有错。
IDE偶尔会给出比较准确的提示,在xx行的模版实例化出错。6.当大家得出的结果与正确的输出结果不匹配时,大家是如何排查问题或者Debug的?
1. 输出到图片,用可以获取鼠标指针下的RGB图片值的图片浏览器,可以帮忙诊断一些问题
2. 写一点代码就编译一下看一下结果
3. debugger在图形学的环境下不好用,太慢。建议打log的形式来分析。
4. 用静态分析工具可以排除一些低级debug
5. 可视化一些变量,比如法向量可以转为RGB可视化This post has received 1 vote up.glm和eigen都是header-only的数学库。
cmake添加glm只需要1行
find_package(glm REQUIRED)
和引入eigen并没有明显区别。OpenGL的工程选用glm的比较多(个人感觉),因为glm的语法是照着glsl的做的,和glsl shader是无缝衔接的。
那个1和-1和左右手坐标系有关系,OpenGL在NDC里面是左手坐标系,闫老师推导过程中都是用的右手坐标系。
-
AuthorPosts