如何在 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# 类?的主要内容,如果未能解决你的问题,请参考以下文章