Unity3D WebGL Безголовый не рендеринг - PullRequest
0 голосов
/ 16 апреля 2020

Я разместил такой же вопрос на форуме Unity, но ответа не было, и поэтому тоже публикую его здесь.

Я пытался запустить Unity WebGL встроенный режим без головы (через кукловода) при сохранении «скриншотов» игры, но рендеринг камеры, похоже, не работает. Полученные изображения все черные .

Это работает , как ожидалось, когда не в режиме без головы (но все еще WebGL ). Это также работает правильно в автономных сборках (например, windows, ma c), через -batchMode .

Вот рассматриваемый код:

// Problem seems to be in the following 2 lines
RenderTexture.active = camera.targetTexture;
camera.Render();

// same dimensions, both in headless and not headless
Debug.Log("CAMERA TARGET TEXTURE WIDTH: " + camera.targetTexture.width);
Debug.Log("CAMERA TARGET TEXTURE HEIGHT: " + camera.targetTexture.height);

tempTexture2D = new Texture2D(camera.targetTexture.width, camera.targetTexture.height, TextureFormat.RGB24, false);
tempTexture2D.ReadPixels(new Rect(0, 0, camera.targetTexture.width, camera.targetTexture.height), 0, 0);
tempTexture2D.Apply();

// RGBA(0.000, 0.000, 0.000, 1.000): totally black, when in WebGL headless mode. Works fine otherwise.
Debug.Log(tempTexture2D.GetPixels(100, 100, 1, 1)[0].ToString());

// Encode texture into JPG
byte[] bytes = tempTexture2D.EncodeToJPG();

// byte count is almost half when in headless mode
Debug.Log("IMG " + frameNumber + " byte count: " + bytes.Length);
// save to persistentData (indexedDB in WebGL)
// that data is then read on client side and encoded again

Я обнаружил некоторые различия между версиями Webgl headfull и headless (соответствующие рисунки ниже). headfull gpu stats headless gpu stats

Я также попытался установить --use-gl=swiftshader, который имеет лучшую статистику GPU, но по-прежнему показывает все в черном: headless swift shader gpu stats

Чтобы было ясно, аргументы, которые я передаю хрому, следующие:

args:[
 '--headless',
 '--hide-scrollbars',
 '--mute-audio',
 '--no-sandbox',
 '--use-gl=swiftshader' // tested with and without
]

вывод журнала без заголовка , получаемый из единицы, равен следующее:

PAGE LOG: Loading player data from data.unity3d
PAGE LOG: Initialize engine version: 2018.4.10f1 (a0470569e97b)
PAGE LOG: Creating WebGL 2.0 context.
PAGE LOG: Renderer: WebKit WebGL
PAGE LOG: Vendor: WebKit
PAGE LOG: Version: OpenGL ES 3.0 (WebGL 2.0 (OpenGL ES 3.0 Chromium))
PAGE LOG: GLES: 3
PAGE LOG: EXT_color_buffer_float GL_EXT_color_buffer_float EXT_float_blend GL_EXT_float_blend EXT_texture_filter_anisotropic GL_EXT_texture_filter_anisotropic OES_texture_float_linear GL_OES_texture_float_linear WEBGL_compressed_texture_etc GL_WEBGL_compressed_texture_etc WEBGL_compressed_texture_etc1 GL_WEBGL_compressed_texture_etc1 WEBGL_compressed_texture_s3tc GL_WEBGL_compressed_texture_s3tc WEBGL_debug_renderer_info GL_WEBGL_debug_renderer_info WEBGL_debug_shaders GL_WEBGL_debug_shaders WEBGL_lose_context GL_WEBGL_lose_context
PAGE LOG: OPENGL LOG: Creating OpenGL ES 3.0 graphics device ; Context level <OpenGL ES 3.0> ; Context handle 1
PAGE LOG: UnloadTime: 0.340000 ms
PAGE LOG: [.WebGL-0x7fcdb69e1600]GL ERROR :GL_INVALID_OPERATION : glFramebufferTexture2D: <- error from previous GL command
PAGE LOG: [.WebGL-0x7fcdb69e1600]GL ERROR :GL_INVALID_OPERATION : GetShaderiv: <- error from previous GL command
PAGE LOG: WebGL: INVALID_OPERATION: renderbufferStorageMultisample: samples out of range
PAGE LOG: [.WebGL-0x7fcdb69e1600]GL ERROR :GL_INVALID_FRAMEBUFFER_OPERATION : glClear: framebuffer incomplete
PAGE LOG: [.WebGL-0x7fcdb69e1600]GL ERROR :GL_INVALID_FRAMEBUFFER_OPERATION : glDrawElements: framebuffer incomplete
PAGE LOG: [.WebGL-0x7fcdb69e1600]GL ERROR :GL_INVALID_FRAMEBUFFER_OPERATION : glDrawArrays: framebuffer incomplete
PAGE LOG: [.WebGL-0x7fcdb69e1600]GL ERROR :GL_INVALID_FRAMEBUFFER_OPERATION : glBlitFramebufferCHROMIUM: framebuffer incomplete

Может ли проблема быть в аппаратном ускорении WebGL вообще? Можно ли отключить его из сборки WebGL?

Эта проблема, по-видимому, связана с: Рендерингом изображения WebGL в автономном режиме chrome без графического процессора

Но, похоже, это работать должным образом, по крайней мере, под MacOS: https://github.com/Apidcloud/WebGLHeadlessRendering

Так что я все еще предполагаю, что это как-то связано с Unity3D. Даже если headfull , он станет чёрным при использовании swift shader, с единственной разницей в статистике GPU декодирование видео - аппаратное ускорение отключено : headfull swift shader gpu stats

Спасибо!

Редактировать с ответом (подробнее о фактическом ответе ниже):

Наконец-то работает, отключив сглаживание в unity , которое, похоже, выдает некоторые ошибки OpenGL. Работает с и без swift shader.

1 Ответ

0 голосов
/ 16 апреля 2020

После 2 или 3 дней борьбы с этим и попытки найти точную проблему, он, наконец, работает, отключив сглаживание в единстве, которое, кажется, выдает некоторые ошибки OpenGL.

Тем не менее, Unity3D Рендеринг WebGL работает без головы (через хром и кукловод) даже без swift shader, хотя это, вероятно, то, что вы хотите для no-gpu сценария ios (например, некоторый сервер).

Вывод журнала, хотя и странный для обоих сценариев ios (с swift shader и без него), выглядит следующим образом ( * обратите внимание, что неполные кадровый буфер ошибок пропали ):

PAGE LOG: [.WebGL-0x7f842a0f6400]GL ERROR :GL_INVALID_OPERATION : glFramebufferTexture2D: <- error from previous GL command
PAGE LOG: [.WebGL-0x7f842a0f6400]GL ERROR :GL_INVALID_OPERATION : GetShaderiv: <- error from previous GL command

Спасибо!

...