Вычислительные шейдеры: как передать нерегулярные структуры в качестве параметров?C#

Место общения программистов C#
Anonymous
Вычислительные шейдеры: как передать нерегулярные структуры в качестве параметров?

Сообщение Anonymous »

Я работаю на C# с Unity.
Я создал вычислительный шейдер, которому хочу передать массив структур данных C#.
Именно тогда я понял, что, возможно, переборщил с фантазией структуры данных вместо того, чтобы придерживаться C-подобных структур шейдеров.
Точнее, я натыкаюсь на два препятствия:
1. Каждый из объектов, которые я хочу передать в буфер шейдера, содержит связанный список, что означает, что размер разных объектов различается. Можно ли определить буфер шейдера как нечто иное, кроме массива, размер которого передается явно?
2. Каждый из объектов, которые я хочу передать в шейдер, является полиморфным. т. е. все они имеют поле «тип», но тогда, если тип == 0, они имеют значение поля 0, а объекты с типом == 1 имеют значение поля1. Разумно ли попытаться добиться этого на языке шейдеров (возможно, с помощью C-подобного объединения)?

Код: Выделить всё

interface IObject {
public int type { get; }
}

class Type0 : IObject {
public int type => 0;
public int field0;
}

class Type1 : IObject {
public int type => 1;
public float field1;
}

class ItemForShader {
public List objects { get; set; }
}
...

// Can I pass this to the shader?
var shaderParameters = new List() {
new ItemForShader() {
objects = new() { new Type0(), new Type1() }
},
new ItemForShader() {
objects = new() { new Type1(), new Type0(), new Type0() }
}
}
Обратите внимание: мне не нужно, чтобы вы подробно описывали какое-либо решение (я уже вижу, что вы описываете, как передать общий пул узлов связанного списка, а затем разделить эти узлы между все объекты с причудливой системой индексации).
Просто хочу знать, что разумно и как это обычно делается (или не делается). Может быть, опишите по существу какая структура C соответствует какой структуре C# в этом сценарии?
РЕДАКТИРОВАТЬ: Как я и опасался, это не сулит ничего хорошего:
Единый массив GLSL с динамической длиной
Создайте несколько шейдеров, по одному на каждое количество потенциальных элементов в
связанных списках, которые вы хотите поддерживать. GLSL не поддерживает массивы
переменного размера. Единственное другое решение — создать массивы самого большого
размера, который вы когда-либо использовали.


Подробнее здесь: https://stackoverflow.com/questions/777 ... parameters

Вернуться в «C#»