我在 Unity 中遇到了我不完全理解的計算著色器問題。我收到一條錯誤訊息:
ArgumentException:傳遞給 ComputeBuffer.SetData(array) 的陣列必須是 blittable。Data.i 不是 blittable,因為它不是值型別 (System.Double[]) Data.w 不是 blittable,因為它不是值型別 (System.Double[])
UnityEngine.ComputeBuffer.SetData (System.Array 資料) (at <3be1a7ff939c43f181c0a10b5a0189ac>:0) Script1.Compute () (at Assets/Script1.cs:46) Script1.Start () (at Assets/Script1.cs:37)
據我所知,我發送的資料是 double[] 型別。這是 C# 代碼:
public class Script1 : MonoBehaviour
{
public double[] inputs;
public double[] weights = { 3.1, 2.1, 8.7 };
float bias = 3;
float output = 0;
public ComputeShader compute1;
ComputeBuffer buffer;
public struct Data
{
public double[] i;
public double[] w;
public float b;
public float o;
}
Data[] d;
// Start is called before the first frame update
void Start()
{
d = new Data[1];
d[0] = new Data
{
i = new double[] { 1.2, 5.1, 2.1 },
w = weights,
b = bias,
o = output
};
buffer = new ComputeBuffer(d.Length, 56);
Compute();
}
void Compute()
{
float[] result = new float[2];
int kernelHandle = compute1.FindKernel("CSMain");
compute1.SetBuffer(kernelHandle, "buffer", buffer);
buffer.SetData(d);
buffer.SetData(result);
compute1.Dispatch(kernelHandle, 24, 1, 1);
buffer.GetData(result);
}
private void OnDestroy()
{
buffer.Dispose();
}
}
這是計算著色器中的代碼。
// Each #kernel tells which function to compile; you can have many kernels
#pragma kernel CSMain
// Create a RenderTexture with enableRandomWrite flag and set it
// with cs.SetTexture
RWTexture2D<float4> Result;
struct d
{
double i[3], w[3];
float b, o;
};
RWStructuredBuffer<d> buffer;
[numthreads(24,1,1)]
void CSMain (uint3 id : SV_DispatchThreadID)
{
// TODO: insert actual code here!
float result[] = { buffer[0].i[0] * buffer[0].w[0] buffer[0].i[1] * buffer[0].w[1] buffer[0].i[2] * buffer[0].w[2] buffer[0].b, 0 };
}
是否有不同的方法可以將雙陣列發送到計算著色器和從計算著色器發送?我嘗試過強制轉換為 (System.Double),它只是說沒有必要并給出相同的錯誤。
uj5u.com熱心網友回復:
您不能將型別傳遞給非 blittable的計算著色器。
雖然你double[]自己實際上是blittable 的,因為它只包含 blittable 型別 ( double) 的值,但它變得不可 blittable ,因為你將它嵌套在另一個struct.
blittable 原始型別的一維陣列,例如整數陣列。但是,包含可變陣列的 blittable 型別本身不是 blittable。
您可以嘗試使用例如NativeArray<double>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/512417.html
上一篇:按下按鈕更改歌曲
下一篇:如何讓物體朝著行進的方向看?
