Resizing the windows breaks the Grading Tutorial - why (SOLVED)

I managed to create all prerequisites for the recently published tutorial: http://www.defold.com/tutorials/grading (the hardest part was learning enough of Blender to get a proper quad with UV mapping).

My scene is displayed as expected when my window size is the same as the display size from the project settings. However, the projection breaks if resizing the window (see screenshots).

Do I need to fix the view/projections when drawing the offscreen buffer, or when drawing TO the offscreen buffer?

The default window size

The window resized ~15%

1 Like

I have not tested that example but my guess is render predicate texture needs to be recreated at new window size on window resize. Something like this but may need to be adapted.

local function update_unitquad_pred(self)

	self.unitquad_exists = self.unitquad_exists or false

	if self.unitquad_exists == true then
		render.delete_render_target(self.effect_render_target)
	end

	local 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 }
   	local 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.effect_render_target = render.render_target("effect_render_target", {[render.BUFFER_COLOR_BIT] = color_params, [render.BUFFER_DEPTH_BIT] = depth_params})
	self.unitquad_exists = true

end

function update(self)

	if (self.temp_window_width ~= render.get_window_width()) or (self.temp_window_height ~= render.get_window_height()) then
		self.temp_window_width = render.get_window_width()
		self.temp_window_height = render.get_window_height()		
		print("updating unitquad predicate on window size update")
		update_unitquad_pred(self)
	end
	
1 Like

Thanks @Pkeod, although I solved the issue differently, you made me thinking in the right direction.

So when initializing the buffer rendering target I replaced render.get_window_width/height with render.get_width. This is important - so that the buffer is created in the same resolution as the target resolution of the app, regardless of the window’s physical size on the screen:

 local color_params = { format = render.FORMAT_RGBA,
                       width = render.get_width(),
                       height = render.get_height() }

Then, when rendering to the off-screen buffer, I made sure to set the viewport to the same target resolution (see the line instead of the commented one):

    render.set_depth_mask(true)
    render.set_stencil_mask(0xff)
    render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color, [render.BUFFER_DEPTH_BIT] = 1, [render.BUFFER_STENCIL_BIT] = 0})

    --render.set_viewport(0, 0, render.get_window_width(), render.get_window_height())
    render.set_viewport(0, 0, render.get_width(), render.get_height())
    render.set_view(self.view)

Finally, when texturing with the off-screen buffer to the final unit quad, I added setting viewport to the windows resolution on every update:

render.clear({[render.BUFFER_COLOR_BIT] = self.clear_color}) 

render.set_viewport(0, 0, render.get_window_width(), render.get_window_height())
render.set_view(vmath.matrix4()) 
render.set_projection(vmath.matrix4())
5 Likes

Cool. Those seem like good changes to the tutorial.

4 Likes

You might like https://github.com/subsoap/deffx/ there are some other render target shaders there (repo is a little messy right now because it’s still new), and if you come up with any new ones please consider contributing them for public use.

3 Likes