Как использовать / конвертировать C # класс в Alea? - PullRequest
0 голосов
/ 02 мая 2019

Я работаю над программой 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 "- это только пользовательский класс, который перегружает операторы.

1 Ответ

0 голосов
/ 17 мая 2019

Вы должны установить некоторые переменные в качестве переменных камеры и использовать их в параллельном цикле for, вы также должны сделать статические версии функций камеры и использовать их в цикле for. хотя я не уверен, что это все исправит, я думаю, вам стоит попробовать, потому что вы сказали, что не можете использовать классную камеру параллельно, и теперь вы не будете использовать ее там.

...