The device is much bigger than the small viewports
The 'device' is usually the size of the entire Irrlicht application window, and the 'viewport' is the current active render area. The 'viewport' is always inside the 'device' window.
whenever I render them what's actually displayed is a resize of the full version render
If you set the viewport to the bottom right corner of the device window and render the scene, you can expect to see the entire scene rendered to the bottom right corner... If you want to render something else to the 'viewport' other than the entire scene, then you should render that after you've called
setViewPort(). If you want to render a different scene, it might be a good idea to create a new scene manager and render that.
I wrote a CGUIViewport class that you should be able to find by doing a search. It allows you to render a scene to a gui window. Each scene can have its scene manager and its own active camera. It can be used to greatly simplify multiple viewport usage.
affects the placement of GUI elements
If you want to render the GUI over the entire device window, you need to set the view area to the entire window before you render the gui.
Is there a way to change the device size (or render the viewport at less resolution) on the fly
That is exactly what a call to
setViewPort() does. It changes the size of the render area.