Я использую renderscriptTargetApi 18
с renderscriptSupportModeEnabled true
на minSdkVersion 21
.
Я создаю распределение с 3 измерениями:
import androidx.renderscript.RenderScript
val 3dAllocation = Allocation.createTyped(rs, Type.createXYZ(rs, Element.U16(rs), 1000, 1000, 100))
Я хочу скопировать данные из плоскости (x, y, z) в плоскость (x, y, z + 1), основываясь на некоторых условиях. Поскольку rsForEachWithOptions
недоступен до API 24, я должен использовать Kotlin для запуска скрипта, который выполняется только в одном Z-индексе:
val opts = Script.LaunchOptions().apply {
setX(0, 1000)
setY(0, 1000)
setZ(1, 1)
}
script.forEach_copyPreviousZ(3dAllocation, 3dAllocation, opts)
Следующий скрипт - это то, что могло бы сделать то, что я хочу, но это не скомпилируется:
rs_allocation 3dAllocation;
ushort RS_KERNEL copyPreviousZ(ushort in, uint32_t x, uint32_t y, uint32_t z){
if(someCondition){
return rsGetElementAt_ushort(z-1);
} else {
return in;
}
}
Но я получаю ошибку:
вычисление ядра copyPreviousZ () для уровней SDK 11-22 может не использовать специальный параметр 'z'.
Есть ли другой способ решения этой проблемы? Я бы предпочел оставить этот код на уровне рендеринга (используя некоторую альтернативу rsForEach*
); и избегайте повторения всего 3dAllocation
, так как это очень тяжелое распределение, и мне нужен только один диапазон Z для вычисления.