Forum Replies Created
-
AuthorPosts
-
这样创建的 m 和 s 的生命周期仅仅在循环体中,每次退出循环都会将它们销毁。这样直接取指针会导致之后使用已销毁的对象,产生运行时错误。
你需要使用动态内存分配的方法对对象的生命周期进行管理。
如masses[i] = new Mass(position, node_mass, false)
, 下面的 springs 也类似。因为这样写的话计算每个像素都需要创建
num_threads
个线程,开销比较大。
最好是将每个线程的任务量尽可能多分配些。This post has received 1 vote up.int id = n_threads * tid + i
改成int id = n_loops * tid + i
看看?在两个三角形边界处进行超采样后,如果产生黑线,说明超采样时越过了被覆盖的蓝色三角形,采样了背景的黑色(或者混合的结果包含背景的黑色)。正确的结果应该是将蓝色和绿色进行混合,边界处产生平滑的过渡。
另外如果背景是白色,那么非交界处的边缘应该是三角形颜色和白色混合,如附图所示,看不见明显的黑边。Attachments:
You must be logged in to view attached files.spp 好像是 1024。
我渲染的结果是这样(加上了色调映射和伽马矫正),好像是差不多的。
This post has received 1 vote up.Attachments:
You must be logged in to view attached files.你可以把最内层的
UpdateProgress()
去掉,再对外层的UpdateProgress()
加锁。1. 浮点运算是有误差的,直接等于的话大概率会判定为不穿过 p。
2. 为什么要判定光线是否穿过一个法向量?This post has received 1 vote down.首先调用链
Renderer:Render()
–>Scene::castRay()
–>Scene::Intersect()
->BVHAccel::Intersect()
–>BVHAccel::getIntersection()
, 此时求的是光线与 Scene 的 BVH 的交, 从 main.cpp 可以知道 BVH 里的物体只有类型为 MeshTriangle 的对象, 那么在 Scene 的叶结点处调用光线与 MeshTriangle 的求交, 即BVHAccel::getIntersection()
–>MeshTriangle::getIntersection()
.
MeshTriangle 构造时从 .obj 读取三角形的信息, 将三角形坐标存放在成员std::vector<Triangle> triangles
内, 并在构造函数的最后构造了它的 BVH. 那么对一个 MeshTriangle 求交时光线就和它的 BVH 求交, 遍历到叶结点时与 Triangle 求交, 即MeshTriangle::getIntersection()
–>BVHAccel::Intersect()
–>BVHAccel::getIntersection()
–> … –>Triangle::getIntersection()
.
总的来说, 就是光线先与 Scene 的 BVH 求交, 再与 MeshTriangle 的 BVH 求交, 最后与 Triangle 求交.This post has received 1 vote up.- This reply was modified 4 years, 8 months ago by arc.
这是两个不同类的方法吧, 一个是
Triangle
的, 另一个是MeshTriangle
的.Vector.hpp 中只声明了
double& operator[](int index)
, 但没有给出其定义, 导致编译器在链接时找不到该函数.This post has received 2 votes up.E2 错了。
你可以使用
gdb
,在编译时加上-g
选项,之后用gdb
跑出错误再打bt
就可以看到调用链中的内容。 -
AuthorPosts