У меня есть холст webGL, управляемый Emscripten, который мне нужно сохранить как изображение из обработчика Javascript. Допустим, есть простая кнопка JS «Сохранить».
<script type="text/javascript">
var Exporter = {
preRun: [],
postRun: [],
save: function() {
var c=Module.canvas;
var d=c.toDataURL("image/png");
var w=window.open('about:blank','image from canvas');
w.document.write("<img src='"+d+"' alt='from canvas'/>");
}
};
</script>
<input type="button" value="Save" onclick="Exporter.save()" />
По умолчанию в контексте webGL для параметра preserveDrawingBuffer установлено значение false, поэтому результирующее изображение будет пустым.
Чтобы на изображении отображалась визуализированная сцена webGL, мне нужно добавить preserveDrawingBuffer: true
к атрибутам, переданным в вызове getContext внутри моего скомпилированного кода Empscripten. Я могу сделать это, вручную отредактировав скомпилированный код empscripten js; результирующее изображение будет правильным, но я бы хотел избежать этого хака - мне пришлось бы делать это после каждой перекомпиляции.
Есть ли более простой и чистый способ добавить preserveDrawingBuffer
к webGLContextAttributes
извне? то есть как вариант компиляции для emcc
, какой-то параметр SDL внутри кода C или из Javascript на странице хостинга?
ОБНОВЛЕНИЕ См. ниже решение; не связанная с этим проблема, с которой я столкнулся, заключалась в том, что сохраненное изображение имело меньшую битовую глубину, а сглаженные линии выглядели довольно плохо. Использование c.toDataURL( "image/jpeg" )
решило это.
preserveDrawingBuffer
. - person Kaiido   schedule 15.05.2017