0

我正在开发一个 RayMarching 程序(HomeWork),我希望它运行得更快,所以我使用带有 ALEA 扩展的 GPU。我有一个问题,因为我不能并行使用类相机(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;
        }
    }
}

而向量类”只是一个重载运算符的自定义类。

4

1 回答 1

0

您应该将一些变量设置为相机的变量并在并行 for 循环中使用它们,您还应该制作相机功能的静态版本并在 for 循环中使用它们。虽然我不确定这会解决它,但我认为你应该尝试一下,因为你说你不能并行使用课堂相机,现在你不会在那里使用它。

于 2019-05-17T10:16:48.143 回答