2

CPU で octree をレイ キャスティングしようとしています (GPU の方が優れていることはわかっていますが、現時点では動作しません。octree テクスチャが正しく作成されていないと思います)。

何をする必要があるかを理解しています。これまでのところ、各ピクセルにレイをキャストし、そのレイが octree 内のいずれかのノードと交差するかどうかを確認しています。存在し、ノードがリーフ ノードでない場合は、光線が子ノードと交差するかどうかを確認します。葉ノードがヒットするまでこれを続けます。リーフ ノードにヒットすると、そのノードの色が取得されます。

私の質問は、これを画面に描画する最良の方法は何ですか? 現在、色を配列に保存してglDrawPixelsで描画していますが、レンダリングにギャップがあり、投影が間違っているため、正しい結果が得られません(glRasterPos3fvを使用しています)。

編集:ここまでのコードはいくつかありますが、クリーンアップが必要です。申し訳ありません。octree レイ キャスティング コードは、必要かどうかわからないので省略しましたが、役立つ場合は投稿します :)

void Draw(Vector cameraPosition, Vector cameraLookAt)
{
// Calculate the right Vector
Vector rightVector = Cross(cameraLookAt, Vector(0, 1, 0));

// Set up the screen plane starting X & Y positions
float screenPlaneX, screenPlaneY;
screenPlaneX = cameraPosition.x() - ( ( WINDOWWIDTH / 2) * rightVector.x());
screenPlaneY = cameraPosition.y() + ( (float)WINDOWHEIGHT / 2);

float deltaX, deltaY;
deltaX = 1;
deltaY = 1;

int currentX, currentY, index = 0;
Vector origin, direction;

origin = cameraPosition;
vector<Vector4<int>> colours(WINDOWWIDTH * WINDOWHEIGHT);

currentY = screenPlaneY;

Vector4<int> colour;

for (int y = 0; y < WINDOWHEIGHT; y++)
{
    // Set the current pixel along x to be the left most pixel
    // on the image plane
    currentX = screenPlaneX;

    for (int x = 0; x < WINDOWWIDTH; x++)
    {
        // default colour is black
        colour = Vector4<int>(0, 0, 0, 0);

        // Cast the ray into the current pixel. Set the length of the ray to be 200
        direction = Vector(currentX, currentY, cameraPosition.z() + ( cameraLookAt.z() * 200 ) ) - origin;
        direction.normalize();

        // Cast the ray against the octree and store the resultant colour in the array
        colours[index] = RayCast(origin, direction, rootNode, colour);

        // Move to next pixel in the plane
        currentX += deltaX;
        // increase colour arry index postion
        index++;
    }

    // Move to next row in the image plane
    currentY -= deltaY;
}

// Set the colours for the array
SetFinalImage(colours);

// Load array to 0 0 0 to set the raster position to (0, 0, 0)
GLfloat *v = new GLfloat[3];
v[0] = 0.0f;
v[1] = 0.0f;
v[2] = 0.0f;

// Set the raster position and pass the array of colours to drawPixels
glRasterPos3fv(v);
glDrawPixels(WINDOWWIDTH, WINDOWHEIGHT, GL_RGBA, GL_FLOAT, finalImage);
}

void SetFinalImage(vector<Vector4<int>> colours)
{
    // The array is a 2D array, with the first dimension
    // set to the size of the window (WINDOW_WIDTH * WINDOW_HEIGHT)
    // Second dimension stores the rgba values for each pizel

    for (int i = 0; i < colours.size(); i++)
    {
        finalImage[i][0] = (float)colours[i].r;
        finalImage[i][1] = (float)colours[i].g;
        finalImage[i][2] = (float)colours[i].b;
        finalImage[i][3] = (float)colours[i].a;
    }
}
4

2 に答える 2

1

ピクセル描画コードは問題ないようです。しかし、あなたの RayCasting ルーチンが正しいかどうかはわかりません。レイトレーサーを書いたとき、画面に水平方向のアーティファクトを引き起こすバグがありましたが、それはレンダリング コードの丸め誤差に関連していました。

vector<Vector4<int>>私はこれを試してみます...色がすべて赤の結果セットを作成します。それを画面にレンダリングします。正しく見える場合、opengl ルーチンは正しいです。分割統治は、常に優れたデバッグ方法です。

ただし、ここで質問があります...後で画像を次のように書き込むときに、Vector4を使用するのはなぜGL_FLOATですか? ここでは int->float 変換は見られません....

于 2011-08-08T16:59:48.157 に答える
0

問題は 3DDDA (octree raycaster) にあり、特にアダプティブ ターミネーションに問題がある可能性があります。これは、光線を gridcell 形式に量子化した結果であり、前景ノードのわずかに後ろにある (つまり、z 深度が高い) 特定の octree ノードが、部分的に表示され、部分的に隠されている必要がありますが、まったくレンダリングされません。ボクセルが小さいほど、これは目立たなくなります。

これが問題かどうかをテストする非常に簡単な方法があります。3DDDA のアダプティブ ターミネーション行をコメント アウトして、同じギャップ アーティファクトが引き続き発生するかどうかを確認します。

于 2011-10-21T15:37:11.930 に答える