【发布时间】:2015-02-05 12:11:50
【问题描述】:
我的任务是优化以下光线追踪器:
void Scene::RayTrace()
{
for (int v = 0; v < fb->h; v++) // all vertical pixels in framebuffer
{
calculateFPS(); // calculates the current fps and prints it
for (int u = 0; u < fb->w; u++) // all horizontal pixels in framebuffer
{
fb->Set(u, v, 0xFFAAAAAA); // background color
fb->SetZ(u, v, FLT_MAX); // sets the Z values to all be maximum at beginning
V3 ray = (ppc->c + ppc->a*((float)u + .5f) + ppc->b*((float)v + .5f)).UnitVector(); // gets the camera ray
for (int tmi = 0; tmi < tmeshesN; tmi++) // iterates over all triangle meshes
{
if (!tmeshes[tmi]->enabled) // doesn't render a tmesh if it's not set to be enabled
continue;
for (int tri = 0; tri < tmeshes[tmi]->trisN; tri++) // iterates over all triangles in the mesh
{
V3 Vs[3]; // triangle vertices
Vs[0] = tmeshes[tmi]->verts[tmeshes[tmi]->tris[3 * tri + 0]];
Vs[1] = tmeshes[tmi]->verts[tmeshes[tmi]->tris[3 * tri + 1]];
Vs[2] = tmeshes[tmi]->verts[tmeshes[tmi]->tris[3 * tri + 2]];
V3 bgt = ppc->C.IntersectRayWithTriangleWithThisOrigin(ray, Vs); // I don't entirely understand what this does
if (bgt[2] < 0.0f || bgt[0] < 0.0f || bgt[1] < 0.0f || bgt[0] + bgt[1] > 1.0f)
continue;
if (fb->zb[(fb->h - 1 - v)*fb->w + u] < bgt[2])
continue;
fb->SetZ(u, v, bgt[2]);
float alpha = 1.0f - bgt[0] - bgt[1];
float beta = bgt[0];
float gamma = bgt[1];
V3 Cs[3]; // triangle vertex colors
Cs[0] = tmeshes[tmi]->cols[tmeshes[tmi]->tris[3 * tri + 0]];
Cs[1] = tmeshes[tmi]->cols[tmeshes[tmi]->tris[3 * tri + 1]];
Cs[2] = tmeshes[tmi]->cols[tmeshes[tmi]->tris[3 * tri + 2]];
V3 color = Cs[0] * alpha + Cs[1] * beta + Cs[2] * gamma;
fb->Set(u, v, color.GetColor()); // sets this pixel accordingly
}
}
}
fb->redraw();
Fl::check();
}
}
两件事:
-
我不完全理解
ppc->C.IntersectRayWithTriangleWithThisOrigin(ray, Vs);的作用。任何人都可以从光线追踪的角度向我解释这一点吗?这是我的“平面针孔相机”类中的函数(这个函数是给我的):V3 V3::IntersectRayWithTriangleWithThisOrigin(V3 r, V3 Vs[3]) { M33 m; // 3X3 matrix class m.SetColumn(0, Vs[1] - Vs[0]); m.SetColumn(1, Vs[2] - Vs[0]); m.SetColumn(2, r*-1.0f); V3 ret; // Vector3 class V3 &C = *this; ret = m.Inverse() * (C - Vs[0]); return ret; }
基本步骤很明显,我只是看不出它实际上在做什么。
- 我将如何从这里优化这个光线追踪器?我在网上找到了一些关于“kd 树”的东西,但我不确定它们有多复杂。有没有人有一些关于优化这个的简单解决方案的好资源?我在破译外面的东西时遇到了一些困难。
谢谢!
【问题讨论】:
-
由于某种原因,我无法让第二个函数正确地“代码块”。对此感到抱歉。
-
似乎您需要对列表内的代码块进行两级缩进。否则对于一般格式帮助 html cmets
<!-- -->总是作为中断工作。 (对于分隔两个紧随其后的代码块很有用。 -
关于该函数的用途,您将获得的最佳答案可能是询问您正在为其优化此代码的人。就我个人而言,如果他们没有做任何文档记录,我不会用 10 英尺长的杆子触碰别人的代码,尤其是在像光线追踪器这样复杂的程序中。
-
问题是这是我们大学的最后一个项目,教授写了代码。至于通过电子邮件向他寻求帮助……通常会遇到“弄清楚”。虽然我相信这个函数可能与计算从眼睛到当前三角形的光线有关?
-
啊,大学。如果您的教授要在现实世界的工作中提供这种混乱,他的同事会当场谋杀他。无论如何是的,它似乎是射线/三角形碰撞检测代码。
标签: c++ optimization graphics rendering raytracing