Вычислительные шейдера на android
Добавлено: 07 июл 2017, 21:43
Привет всем щейдерным гуру. Бьюсь несколько дней над одной задачей - есть 2 текстуры, берем 1, колдуем с ней в шейдере и засовываем во 2.
В редакторе все хорошо , в билде на пк тоже, а вот на андроиде через-раз. Иногда видно нужный результат , иногда психоделические глюки, иногда нужный результат в перемешку с глюками...
с SystemInfo.supportsComputeShaders все хорошо, enableRandomWrite включен, в скрипте все норм :
в шейдере все просто, здесь приведу для примера 2 примитивных :
есть догадки но не могу найти нормальной документации, возможно не подходит кол-во потоков?.. возможно нужен особый RenderTextureFormat ?.. может проблема в том что текстура для считывания это WebCamTexture?
Буду благодарен за помощь и верное копательное направление
В редакторе все хорошо , в билде на пк тоже, а вот на андроиде через-раз. Иногда видно нужный результат , иногда психоделические глюки, иногда нужный результат в перемешку с глюками...
с SystemInfo.supportsComputeShaders все хорошо, enableRandomWrite включен, в скрипте все норм :
Синтаксис:
Используется csharp
_kernelID = computeShader.FindKernel(_name);
computeShader.GetKernelThreadGroupSizes(_kernelID, out _kernelX, out _kernelY, out _kernelZ);
computeShader.SetTexture(_kernelID, "result", outputTexture);
computeShader.SetTexture(_kernelID, "inputTex", inputWebCamTexture);
...
computeShader.Dispatch(_kernelID, width / (int)_kernelX, height / (int)_kernelY, (int)_kernelZ);
computeShader.GetKernelThreadGroupSizes(_kernelID, out _kernelX, out _kernelY, out _kernelZ);
computeShader.SetTexture(_kernelID, "result", outputTexture);
computeShader.SetTexture(_kernelID, "inputTex", inputWebCamTexture);
...
computeShader.Dispatch(_kernelID, width / (int)_kernelX, height / (int)_kernelY, (int)_kernelZ);
в шейдере все просто, здесь приведу для примера 2 примитивных :
Синтаксис:
Используется glsl
Texture2D<float4> inputTex;
SamplerState samplerinputTex;
RWTexture2D<float4> result;
#pragma kernel Red
[numthreads(8,8,1)] void Red (uint3 id : SV_DispatchThreadID){
result[id.xy] = float4(1.0, 0.0, 0.0, 1.0);
}
#pragma kernel Normal
[numthreads(8,8,1)] void Normal (uint3 id : SV_DispatchThreadID){
result[id.xy] = inputTex[id.xy];
}
SamplerState samplerinputTex;
RWTexture2D<float4> result;
#pragma kernel Red
[numthreads(8,8,1)] void Red (uint3 id : SV_DispatchThreadID){
result[id.xy] = float4(1.0, 0.0, 0.0, 1.0);
}
#pragma kernel Normal
[numthreads(8,8,1)] void Normal (uint3 id : SV_DispatchThreadID){
result[id.xy] = inputTex[id.xy];
}
есть догадки но не могу найти нормальной документации, возможно не подходит кол-во потоков?.. возможно нужен особый RenderTextureFormat ?.. может проблема в том что текстура для считывания это WebCamTexture?
Буду благодарен за помощь и верное копательное направление