我是靠谱客的博主 还单身水壶,最近开发中收集的这篇文章主要介绍【GAMES101】作业7 常见问题避坑,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本文仅对作业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 常见问题避坑所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部