我任務是優化下面的射線追蹤:優化光線追蹤
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樹」的內容,但我不確定它們有多複雜。有沒有人有一些優化這個簡單的解決方案的好資源?我解釋了那裏有什麼困難。
謝謝!
出於某種原因,我不能拿到第二個功能正確地「編碼」。對於那個很抱歉。 – Jestus 2014-12-07 21:07:27
好像您需要列表中的代碼塊的兩個級別的縮進。否則,對於一般格式幫助HTML評論''總是作爲休息。 (用於分隔兩個直接相連的代碼塊 – 2014-12-07 21:20:12
可能最好的答案是關於該函數的目的是從詢問優化此代碼的人,我個人不會碰到某人如果他們沒有做任何記錄,尤其是在一個像光線追蹤器那樣複雜的程序中,則需要使用10英尺的極點代碼 – user2867288 2014-12-07 21:30:41