私はOpenTKを使用してC#で簡単なレイキャスターを書いています。ビューを1秒間に60回更新したいので、Render()関数を呼び出すタイマーがあり、画面にテクスチャが表示されます。
再帰関数を使用して、シーンを小さな長方形に分割し、長方形のサイズが1pxになるまでそれぞれをレンダリングすることで、シーンをレンダリングしたいと思います。私の再帰は、ピクセルの色をバイト配列に書き込みます。これをテクスチャに変換する必要があります。再帰はかなり遅いので、シーンが変わるたびにバックグラウンドスレッドで実行したいと思います。
一方がテクスチャ配列に書き込むようにスレッドを同期する正しい方法は何ですか(約1秒かかります)が、もう一方のスレッドは1/60秒ごとにそれを読み取り、画面に印刷しますか?
byte[, ,] texture;
再帰:
public void RenderAdaptively(int top, int left, int width, int height)
{
Color color = getColor(top, left);
for (int i = top; i < top + width + 1; i++)
{
for (int j = left; j < left + height; j++)
{
texture[i, j, 0] = color.R;
texture[i, j, 1] = color.G;
texture[i, j, 2] = color.B;
}
}
int halfw = width / 2;
int halfh = height / 2;
int newwidth = width - halfw;
int newheight = height - halfh;
if (width > 1 && height > 1)
{
RenderAdaptively(top, left, halfw, halfh, false);
RenderAdaptively(top + halfw, left + halfh, newwidth, newheight, false);
RenderAdaptively(top, left + halfh, halfw, newheight, false);
RenderAdaptively(top + halfw, left, newwidth, halfh, false);
}
}
別のスレッドで:
raycasting_texture = TexUtil.CreateRGBTexture(width, height, texture);