我正在嘗試使用 Unity 編寫一個計算著色器,為體素地形生成網(wǎng)格數(shù)據(jù)(頂點、法線、UV)。因此,我有一個自定義結構定義如下:[StructLayout(LayoutKind.Sequential, Pack = 0)]private struct VertexData{ public Vector3 position; public Vector3 normal; public Vector2 uv;}然后,我正在為 ComputeShader 創(chuàng)建一個 ComputeBuffer,如下所示:vecterDataCBuf = new ComputeBuffer(ChunkSize * ChunkSize * ChunkSize, sizeof(VertexData));我收到 CS0233 錯誤,表明我無法在自定義結構上使用 sizeof 運算符來提供計算緩沖區(qū)的步幅,盡管我添加了打包屬性。所以我的問題是,如何在沒有硬編碼的情況下獲得結構的大?。恐x謝你。
2 回答

Cats萌萌
TA貢獻1805條經(jīng)驗 獲得超9個贊
sizeof除非您在unsafe上下文中,否則僅適用于預定義的類型。從參考sizeof:
下表顯示了替換具有某些內(nèi)置類型作為操作數(shù)的 sizeof 表達式的常量值。[...] 對于所有其他類型,包括結構體,sizeof 運算符只能在不安全的代碼塊中使用。
所以把你的電話包裝成unsafe這樣:
int sizeOfVertexData;
unsafe
{
sizeOfVertexData = sizeof(VertexData);
}
您還必須啟用不安全代碼。在 Unity 中,它顯然是一個復選框。

慕標5832272
TA貢獻1966條經(jīng)驗 獲得超4個贊
您可以通過添加每個屬性大小來計算結構的總大小。
Vector3 相當于 3 個浮點數(shù)。Vector2 相當于 2 個浮點數(shù)。
//int stride = sizeof(position) + sizeof(normal) + sizeof(uv)
//int stride = sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector2)
int stride = sizeof(float) * 3 + sizeof(float) * 3 + sizeof(float) * 2
你不需要不安全的東西。
- 2 回答
- 0 關注
- 275 瀏覽
添加回答
舉報
0/150
提交
取消