Thanks for the response – I agree, this feels very simple and like working directly with OpenGL in a good way.
I managed to render my 3D scene to a render target, and then render that to a screen quad (-1 to 1 coordinates), but I still can’t seem to overlay the builtin UI on top. Text shows, with black backgrounds, and other GUI nodes don’t show at all. I tried moving the Z-order of the GUI game object in the main.collection, to no avail… I was seeing GUI nodes before, but I centered some objects in the collection and somehow it stopped working.
My render script is like this… note, I will probably try to use a screen quad in 0-1 and set the scale of the object to the window dimensions, in order to avoid having to set two ortho matrices here…
function init(self)
self.view_pred = render.predicate({"3d"})
self.screen_pred = render.predicate({"screen"})
self.gui_pred = render.predicate({"gui"})
self.text_pred = render.predicate({"text"})
...
-- Set up render target
self.view_color_params = {
format = render.FORMAT_RGBA,
width = render.get_window_width(),
height = render.get_window_height(),
min_filter = render.FILTER_LINEAR,
mag_filter = render.FILTER_LINEAR,
u_wrap = render.WRAP_CLAMP_TO_EDGE,
v_wrap = render.WRAP_CLAMP_TO_EDGE }
self.view_depth_params = {
format = render.FORMAT_DEPTH,
width = render.get_window_width(),
height = render.get_window_height(),
u_wrap = render.WRAP_CLAMP_TO_EDGE,
v_wrap = render.WRAP_CLAMP_TO_EDGE }
self.view_target = render.render_target("view", {
[render.BUFFER_COLOR_BIT] = self.view_color_params,
[render.BUFFER_DEPTH_BIT] = self.view_depth_params })
end
function update(self, dt)
if self.redraw_needed then
self.redraw_needed = false
-- draw 3D scene onto the view render target
render.enable_render_target(self.view_target)
-- setup viewport and clear the texture
render.set_viewport(0, 0, render.get_window_width(), render.get_window_height())
render.clear({[render.BUFFER_COLOR_BIT] = vmath.vector4(0.35),
[render.BUFFER_DEPTH_BIT] = 1})
-- setup state (we need to enable depth testing for 3D stuff)
render.enable_state(render.STATE_DEPTH_TEST)
render.set_depth_mask(true)
-- set matrices
render.set_view(self.view_mtx)
render.set_projection(self.proj_mtx)
-- draw 3d predicate
render.draw(self.view_pred)
render.disable_render_target(self.view_target)
end
-- setup sysfbo viewport and clear screen
render.set_viewport(0, 0, render.get_window_width(), render.get_window_height())
render.clear({[render.BUFFER_COLOR_BIT] = vmath.vector4(0.4),
[render.BUFFER_DEPTH_BIT] = 1})
-- enable orthographic rendering of screenquad into full window viewport
render.set_view(vmath.matrix4())
render.set_projection( vmath.matrix4_orthographic( -1, 1, -1, 1, -1, 1 ) )
-- draw screen quad to sysfbo
render.enable_texture(0, self.view_target, render.BUFFER_COLOR_BIT)
render.draw(self.screen_pred)
render.disable_texture(0)
render.set_projection(vmath.matrix4_orthographic(0, render.get_window_width(), 0, render.get_window_height(), -1, 1))
-- try to draw ui and text
render.enable_state(render.STATE_STENCIL_TEST)
render.draw(self.gui_pred)
render.draw(self.text_pred)
render.disable_state(render.STATE_STENCIL_TEST)
-- render.draw_debug2d()
end
Is there something simple I’m doing wrong?
edit: Okay, so disabling depth test allows the gui nodes to render, but then my 3D scene texture is shredded for some reason. With depth testing left on, it works fine, but all I can see is the text – I’m okay with that, I can render my own GUI shapes. But now I need to solve the black text boundaries problem… wants a certain blend mode, I’m guessing?
Sorry for asking probably obvious questions, I’ll try to read the manual more closely.