概述
本文仅对作业7中的一些常见问题做总结,避免大家重复踩坑,作业具体实现细节可见:【GAMES101】作业7
1. 渲染耗时过长?
使用了多线程,但是一次spp为1000以上的渲染还是要几个小时?可能是global.hpp下的get_random_float()随机数生成函数存在问题,它会导致在重复调用该函数时,返回同一个值。
解决方法:把其中定义的dev,rng,dist变量定义为静态变量(加个static修饰),这样最后的时间消耗就缩短了大概几十倍
2. 渲染结果中光源区域为纯黑?
作业给的伪代码中缺少了光线直接与光源相交的部分,所以是纯黑,记得加上这部分
3. 渲染结果较暗?
如果有渲染结果较暗,出现横向黑色条纹的情况,那么,很可能是因为直接光部分由于精度问题,被错误判断为遮挡,可以试着通过精度调整放宽相交限制(将EPSILON变量增大),同时可能因为老师课上说浮点数相等可能性很低,所以在判断条件中设置为 t_enter < t_exit而忘了等号,所以可能会有一定的出入,这次作业一定不要忘记加上
4. 天花板黑色,墙面没有影子?
同样的,因为cornell box是由墙壁面组成的,使得包围盒高度为0,所以 t_exit >= 0也不要忘了等号,否则会导致天花板黑色,且盒子在地板和墙面没有影子
5. 多线程编译时出现undefined reference to `pthread_create’?
pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a.
所以在使用pthread_create()创建线程时,需要链接该库。
解决方法是打开CMakelists.txt,添加下列语句:
cmake_minimum_required (VERSION 2.6)
find_package (Threads)
add_executable (myapp main.cpp …)
target_link_libraries (myapp ${CMAKE_THREAD_LIBS_INIT})
本作业中为:
同时还要注意,往多线程的启动函数里传入参数的时候,需要引用的参数一定要用std::ref来拷贝,否则构析的时候会出错,如:
rays.push_back(std::thread(para, eye_pos, std::ref(framebuffer), std::ref(scene), spp,
imageAspectRatio, scale, i * thread_step, (i + 1) * thread_step));
6 渲染出现白色噪点?
原因应该是pdf接近于0时,除以它计算得到的颜色会偏向极限值,体现在图上也就是白色
要解决这个问题,对于pdf接近于0的情况直接将它的radience算作0就行:
float pdf = intersec.m->pdf(ray.direction, obj2nextobjdir, intersec.normal);
if (pdf > EPSILON)
{
l_indir = castRay(obj2nextobjray, depth + 1)
* intersec.m->eval(ray.direction, obj2nextobjdir, intersec.normal)
* dotProduct(obj2nextobjdir, intersec.normal)
/ pdf / RussianRoulette;
}
优化后效果:
最后
以上就是还单身水壶为你收集整理的【GAMES101】作业7 常见问题避坑的全部内容,希望文章能够帮你解决【GAMES101】作业7 常见问题避坑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复