use Godot script to create a picture

4.5.1

I am trying to use Godot script to create a picture, using Debian 12. Using opengl3, PNG is checker gray and white. Using xvfb-run, PNG is black. This text document is 8 KB.

Obtain Godot. From Download for Linux – Godot Engine, use the web browser firefox to download Godot_v4.5.1-stable_linux.x86_64.zip. Use the default target folder, Downloads.

Install and setup Godot.[code]

mkdir -p project/godot/4.5.1/primitive
cp Downloads/Godot_v4.5.1-stable_linux.x86_64.zip project/godot/4.5.1
cd project/godot/4.5.1
unzip Godot_v4.5.1-stable_linux.x86_64.zip
chmod +x project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64
[/code]

test Godot

ls Downloads/Godot_v4.5.1-stable_linux.x86_64.zip
ls project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64.zip
ls project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64
ls .local/share/godot/
ls .local/share/godot/app_userdata
project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64 --version

4.5.1.stable.official.f62fdbde1

Check if your system can run the headless version. Headless version is a special Godot binary that does not use graphics. If this runs and prints command-line options, your system can run Godot without GUI.

project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64 --headless --help
[/code]

Create a small test directory and files (no graphics yet):[code]

mkdir -p project/godot/4.5.1/small
[/code]

Create these files:
Content of text file project/godot/4.5.1/small/project.godot: [application] config/name="small" config/version="0.1" run/main_scene="res://main.tscn"

Content of text file project/godot/4.5.1/small/main.tscn: [gd_scene load_steps=2 format=3] [ext_resource path="res://main.gd" type="Script" id=1] [node name="Node" type="Node"] script = ExtResource("1")

Content of text file project/godot/4.5.1/small/main.gd: extends Node func _ready(): print("Hello from Godot headless test") get_tree().quit()

Bash commands to check if files exist and are in correct place:[code]
ls project/godot/4.5.1/small/project.godot
ls project/godot/4.5.1/small/main.gd
ls project/godot/4.5.1/small/main.tscn
ls .local/share/godot/app_userdata/PrimitiveRenderer/logs/godot.log

Run small headless:[code]

project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64 --headless --path project/godot/4.5.1/small --quit
[/code]

it prints “Hello from Godot headless test” in terminal, Godot is working correctly.

Create a directory and files (primitive graphics):[code]

mkdir -p project/godot/4.5.1/primitive
[/code]

Content of text file project/godot/4.5.1/primitive/project.godot: [application] config/name="PrimitiveRenderer" run/main_scene="res://main.tscn"

Content of text file project/godot/4.5.1/primitive/main.tscn:[code]
[gd_scene load_steps=3 format=3]

[ext_resource path=“res://main.gd” type=“Script” id=1]

[node name=“Main” type=“Node3D”]
script = ExtResource(1)

[node name=“Camera3D” type=“Camera3D” parent=“.”]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 5)

[node name=“Light” type=“DirectionalLight3D” parent=“.”]
light_energy = 1.5
[/code]

Content of text file project/godot/4.5.1/primitive/main.gd:[code]
extends Node3D

func _ready():
print(“Scene ready”)

var mesh_instance = MeshInstance3D.new()
mesh_instance.mesh = BoxMesh.new()
mesh_instance.transform.origin = Vector3(0, 0, 0)
add_child(mesh_instance)

var environment = WorldEnvironment.new()
environment.environment = Environment.new()
environment.environment.background_mode = Environment.BG_COLOR
environment.environment.background_color = Color(0.1, 0.1, 0.1)
add_child(environment)

var camera = $Camera3D
camera.current = true

await get_tree().process_frame
await get_tree().process_frame
capture_screenshot()
get_tree().quit()

func capture_screenshot():
var dir = DirAccess.open(“user://”)
if not dir.dir_exists(“renders”):
dir.make_dir(“renders”)
var image = get_viewport().get_texture().get_image()
var path = “user://renders/box.png”
image.save_png(path)
print("Saved screenshot to: ", path)
[/code]

Bash commands to check if files exist and are in correct place:[code]

ls project/godot/4.5.1/primitive/project.godot
ls project/godot/4.5.1/primitive/main.gd
ls project/godot/4.5.1/primitive/main.tscn
ls .local/share/godot/app_userdata/PrimitiveRenderer/logs/godot.log
ls .local/share/godot/app_userdata/PrimitiveRenderer/renders/box.png
cp .local/share/godot/app_userdata/PrimitiveRenderer/logs/godot.log project/godot/4.5.1/primitive
cp .local/share/godot/app_userdata/PrimitiveRenderer/renders/box.png project/godot/4.5.1/primitive
[/code]

Godot in --headless mode does not support rendering, so this will not work: project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64 --headless --path project/godot/4.5.1/primitive --quit

This does work without warning message: Use --rendering-driver opengl3 instead of --headless. Graphic output is checker gray and white.[code]

project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64 --rendering-driver opengl3 --quit --path project/godot/4.5.1/primitive
mkdir -p project/godot/4.5.1/primitive/opengl3
cp .local/share/godot/app_userdata/PrimitiveRenderer/logs/godot.log project/godot/4.5.1/primitive/opengl3
cp .local/share/godot/app_userdata/PrimitiveRenderer/renders/box.png project/godot/4.5.1/primitive/opengl3
[/code]

.local/share/godot/app_userdata/PrimitiveRenderer/logs/godot.log says Godot Engine v4.5.1.stable.official.f62fdbde1 - https://godotengine.org OpenGL API 4.5 (Core Profile) Mesa 22.3.6 - Compatibility - Using Device: AMD - KABINI (, LLVM 15.0.6, DRM 2.50, 6.1.0-41-amd64) Saved screenshot to: user://renders/box.png
.local/share/godot/app_userdata/PrimitiveRenderer/renders/box.png is checker gray and white.

Another option is to use a virtual framebuffer (Xvfb). Install and use Xvfb to simulate a display environment for Godot to render in. This gives Godot a virtual display, enabling rendering. Graphic output is black.[code]

sudo apt install xvfb
ls /usr/bin/xvfb-run

As is so far, when run, this warning appears.

WARNING: XOpenIM failed
     at: DisplayServerX11 (platform/linuxbsd/x11/display_server_x11.cpp:6973)
WARNING: XCreateIC couldn't create wd.xic
     at: _create_window (platform/linuxbsd/x11/display_server_x11.cpp:6568)
Vulkan 1.3.230 - Forward+ - Using Device #0: Unknown - llvmpipe (LLVM 15.0.6, 256 bits)

Here are some ways that might fix the warning, I tried some. ibus-daemon -drx GTK_IM_MODULE=none QT_IM_MODULE=none XMODIFIERS=@none godot sudo apt install ibus ibus-gtk4 ibus-gtk3 ibus-gtk ibus-x11 sudo apt install fcitx5 fcitx5-config-qt fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 fcitx5-frontend-qt5 I hear the warning has no effect, so I ignore it and move on.

/usr/bin/xvfb-run -a project/godot/4.5.1/Godot_v4.5.1-stable_linux.x86_64 --quit --path project/godot/4.5.1/primitive
mkdir -p project/godot/4.5.1/primitive/xcfb
cp .local/share/godot/app_userdata/PrimitiveRenderer/logs/godot.log project/godot/4.5.1/primitive/xcfb
cp .local/share/godot/app_userdata/PrimitiveRenderer/renders/box.png project/godot/4.5.1/primitive/xcfb

.local/share/godot/app_userdata/PrimitiveRenderer/logs/godot.log says Godot Engine v4.5.1.stable.official.f62fdbde1 - https://godotengine.org Saved screenshot to: user://renders/box.png

.local/share/godot/app_userdata/PrimitiveRenderer/renders/box.png is black.