如何在 Alea 中使用/转换 C# 类?

Posted

技术标签:

【中文标题】如何在 Alea 中使用/转换 C# 类?【英文标题】:How to use/Convert C# class in Alea? 【发布时间】:2019-09-21 08:26:25 【问题描述】:

我正在开发一个 RayMarching 程序 (HomeWork),我希望它运行得更快,所以我使用带有 ALEA 扩展的 GPU。我有一个问题,因为我不能并行使用类相机(GPU)。 谢谢你的帮助。

我已经尝试更改类的标签并在 Parallel for 中创建它们

        [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】:

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

【讨论】:

非常感谢 :)

以上是关于如何在 Alea 中使用/转换 C# 类?的主要内容,如果未能解决你的问题,请参考以下文章

Alea GPU 可用内存

如何在 C# 中将 .json 文件转换为字符串 [重复]

如何将 Handsontable 数据转换回 C# 类

C#如何将xml数据转换成Array类型或者集合类?多谢!!!

C#如何将集合转换成实体对象

如何将 ISearchResponse <dynamic> 转换为 C# 类对象?