Я работаю над программой RayMarching (HomeWork) и хочу, чтобы она работала быстрее, поэтому я использую графический процессор с расширением ALEA. У меня проблема, потому что я не могу использовать класс камеры в параллели для (GPU).
Спасибо за вашу помощь.
Я уже пытался изменить тег класса и создать их внутри Parallel для
[GpuManaged, Test]
public static Bitmap DelegateWithClosureGpu(Scene s, Camera my_camera, SDF sdfList, int w, int h)
{
my_camera.SetScreenData(w,h);
int nbsteps;
float dyst;
Bitmap res = new Bitmap(w,h);
ParallelForTest.camera = my_camera;
Gpu.Default.For(0, res.Height , i =>
{
for (int j = 0; j < res.Height; j++)
{
Vector3 ray = ParallelForTest.camera.GetRay(i, j);
ray.Normalized();
s.RayMarch(sdfList, ray, ParallelForTest.camera.origin,out nbsteps,out dyst);
if (Scene.FloatEq(dyst,0f))
{
res.SetPixel(i,j,Color.White);
}
else
{
res.SetPixel(i,j,Color.Black);
}
}
});
return res;
}
using System;
using Alea;
namespace Raymarcher
{
[GpuManaged]
public class Camera
{
[GpuParam]
public Vector3 origin;
[GpuParam]
private Vector3 forward;
[GpuParam]
private Vector3 up;
private Vector3 right;
private Vector3 screenOrigin;
private float stepY;
private float stepX;
private float sizeX;
private float sizeY;
public Camera(Vector3 origin, Vector3 forward, float fov)
{
this.forward = forward.Normalized();
this.right=(new Vector3(-forward.z,0,forward.x)).Normalized();
this.up = (right * forward).Normalized();
this.origin = origin;
}
public void SetScreenData(int width, int height)
{
sizeY = (width / height) * sizeX;
stepX = sizeX/width;
stepY = sizeY/height;
screenOrigin = origin+forward + (up * (sizeY / 2f)) - (right * (sizeX / 2f));
}
public Vector3 GetRay(int x, int y)
{
return screenOrigin-origin+stepX*x*right-up*y*stepY;
}
}
}
и Class Vector "- это только пользовательский класс, который перегружает операторы.