首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Alea中使用/转换C#类?

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

Stack Overflow用户
提问于 2019-05-03 03:12:36
回答 1查看 271关注 0票数 0

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

我已经尝试更改类的标记,并在并行中为

代码语言:javascript
复制
        [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;
        }
代码语言:javascript
复制
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;
        }
    }
}

和类向量“只是一个重载操作符的自定义类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-17 18:16:48

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55958819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档