Рендеринг изображения WebGL в безголовом chrome без GPU
Я пытаюсь экспортировать изображение, отображаемое с помощью WebGL на сервере linux без GPU. Для этого я использую безголовый хром, однако экспортированное изображение черное (пример экспортированного изображения, скриншот страницы показывает ее просто полотно, черный). Я надеялся помочь понять, почему это происходит.
чтобы экспортировать изображение, я рендеринг изображения в холст, экспорт данных через canvas.toDataURL('image/jpeg')
а затем разместить данные на сервере. Я использование Pixi.js для рендеринга, если я использую Canvas renderer, то все работает на сервере; это рендеринг WebGL, который не работает. Стоит отметить, что WebGL render отлично работает в Chrome 63 на Macbook.
для управления Chrome я использую Кукловод. Все, что я делаю, это открываю страницу, жду секунду, а затем снова закрываю ее:
puppeteer
.launch({
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
],
})
.then(browser => {
return browser.newPage().then(page => {
return page
.goto(url)
.then(() => page.waitFor(1000))
.then(() => browser.close())
.catch(err => console.error('Failed', err));
});
})
вот аргументы, которые кукольник передает Chrome:
[
'--disable-background-networking',
'--disable-background-timer-throttling',
'--disable-client-side-phishing-detection',
'--disable-default-apps',
'--disable-extensions',
'--disable-hang-monitor',
'--disable-popup-blocking',
'--disable-prompt-on-repost',
'--disable-sync',
'--disable-translate',
'--metrics-recording-only',
'--no-first-run',
'--remote-debugging-port=0',
'--safebrowsing-disable-auto-update',
'--enable-automation',
'--password-store=basic',
'--use-mock-keychain',
'--user-data-dir=/tmp/puppeteer_dev_profile-GhEAXZ',
'--headless',
'--disable-gpu',
'--hide-scrollbars',
'--mute-audio',
'--no-sandbox',
'--disable-setuid-sandbox'
]
на автор swiftshader сказал в июне безголовый рендеринг WebGL возможен и вроде бы подтверждено этой проблемой хрома значит, я что-то упускаю. Кто-нибудь знает, что я делаю не так?
несколько вещей, которые я пробовал:
- не проходит в --disable-gpu
-
--use-gl=swiftshader-webgl
,--use-gl=swiftshader
,--use-gl=osmesa
- взяв полный скриншот экрана, чтобы увидеть, если его просто холст. Весь экран просто черный.
версии
- Chrome: linux-515411
- кукловод: 0.13.0
- узел: 8.2.1
- Linux: CentOS 7
это то, что мне нужно было установить на моем сервере, чтобы запустить chrome (источник)
yum install cups-libs dbus-glib libXrandr libXcursor libXinerama cairo cairo-gobject pango ffmpeg
rpm -ivh --nodeps http://mirror.centos.org/centos/7/os/x86_64/Packages/atk-2.22.0-3.el7.x86_64.rpm
rpm -ivh --nodeps http://mirror.centos.org/centos/7/os/x86_64/Packages/at-spi2-atk-2.22.0-2.el7.x86_64.rpm
rpm -ivh --nodeps http://mirror.centos.org/centos/7/os/x86_64/Packages/at-spi2-core-2.22.0-1.el7.x86_64.rpm
rpm -ivh --nodeps http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/20/Fedora/x86_64/os/Packages/g/GConf2-3.2.6-7.fc20.x86_64.rpm
rpm -ivh --nodeps http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/20/Fedora/x86_64/os/Packages/l/libXScrnSaver-1.2.2-6.fc20.x86_64.rpm
rpm -ivh --nodeps http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/20/Fedora/x86_64/os/Packages/l/libxkbcommon-0.3.1-1.fc20.x86_64.rpm
rpm -ivh --nodeps http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/20/Fedora/x86_64/os/Packages/l/libwayland-client-1.2.0-3.fc20.x86_64.rpm
rpm -ivh --nodeps http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/20/Fedora/x86_64/os/Packages/l/libwayland-cursor-1.2.0-3.fc20.x86_64.rpm
rpm -ivh --nodeps http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/20/Fedora/x86_64/os/Packages/g/gtk3-3.10.4-1.fc20.x86_64.rpm
rpm -ivh --nodeps http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/16/Fedora/x86_64/os/Packages/gdk-pixbuf2-2.24.0-1.fc16.x86_64.rpm
2 ответов
поэтому я частично решил проблему, установив premultipliedAlpha
значение false. Когда это true (по умолчанию), toDataURL
вернет пустое изображение. Если false, он возвращает отображаемое изображение.
<!DOCTYPE html>
<html>
<body>
<canvas id="canvas" width="1080" height="1080"></canvas>
<script type="text/javascript">
var canvas = document.getElementById('canvas');
var gl = canvas.getContext('webgl', {
premultipliedAlpha: false
});
gl.viewportWidth = canvas.width;
gl.viewportHeight = canvas.height;
gl.clearColor(0.99, 0, 1, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
var IMAGE_PREFIX = 'data:image/png;base64,';
var image = canvas.toDataURL('image/png').substring(IMAGE_PREFIX.length);
// save(image)
</script>
</body>
</html>
что интересно, если я сделаю снимок экрана с помощью puppeteer
Я могу увидеть изображение, независимо от того,premultipliedAlpha
true или false.
есть открытая ошибка, которая влияет на системы без библиотек X11:crbug.com/swiftshader/79. Это предотвращает Chrome OS от работы с SwiftShader, но та же проблема также произойдет на безголовой системе Linux, которая не имеет поддержки X11.
к счастью, должно быть возможно установить X11 и запустить все. Я не уверен на 100%, какие пакеты предоставляют необходимые библиотеки, но попробуйте следующее:xorg xserver-xorg xvfb libx11-dev libxext-dev libxext-dev:i386
в конечном итоге ошибка SwiftShader будет исправлено, поэтому он не требует X11 вообще.