1

我正在尝试使用 raycast 编写游戏,并且我想将 raycast 计算传输到 gpu,但由于某种原因它给出了资源不足错误

我应该在其中执行内核的函数

    public unsafe void GpGPU_Ray(float px, float py, float[] angle, out float[] dists, out float[] offsets)
    {
        OpenCLTemplate.CLCalc.Program.Variable varPx = new OpenCLTemplate.CLCalc.Program.Variable(new float[1] { px });
        OpenCLTemplate.CLCalc.Program.Variable varPy = new OpenCLTemplate.CLCalc.Program.Variable(new float[1] { py });
        
        OpenCLTemplate.CLCalc.Program.Variable varAngle = new OpenCLTemplate.CLCalc.Program.Variable(angle);
        OpenCLTemplate.CLCalc.Program.Variable varMap = new OpenCLTemplate.CLCalc.Program.Variable(NumberMap);
        OpenCLTemplate.CLCalc.Program.Variable varWidth = new OpenCLTemplate.CLCalc.Program.Variable(new float[1] { Map.Width });
        OpenCLTemplate.CLCalc.Program.Variable varDists = new OpenCLTemplate.CLCalc.Program.Variable(new float[angle.Length]);
        OpenCLTemplate.CLCalc.Program.Variable varOffsets = new OpenCLTemplate.CLCalc.Program.Variable(new float[angle.Length]);

        OpenCLTemplate.CLCalc.Program.Variable[] args = new OpenCLTemplate.CLCalc.Program.Variable[] { varPx, varPy, varAngle, varMap, varWidth, varDists, varOffsets};
        var MaxWGSZ = OpenCLTemplate.CLCalc.CLDevices[0].MaxWorkGroupSize;


        int[] workers = new int[1] { angle.Length };

        RayCastKernel.Execute(args, workers);
        //OpenCLTemplate.CLCalc.Program.Sync();

        varPx.Dispose();
        varPy.Dispose();
        varAngle.Dispose();
        varMap.Dispose();
        varWidth.Dispose();


        dists = new float[angle.Length];
        offsets = new float[angle.Length];

        //At this moment an exception occurs
        varDists.ReadFromDeviceTo(dists);
        varOffsets.ReadFromDeviceTo(offsets);

        varDists.Dispose();
        varOffsets.Dispose();

        RayCastKernel.Dispose();
    }
4

0 回答 0