3d object in 2d viewport broken in Mono version?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By jayCgee

I’ve been working in the Mono version of 3.2.1 (and 3.2.2) to develop a top-down ARPG, but I may have run in to a major roadblock. After searching around for the best way to build out my art pipeline, I thought I had found the exact technique I needed. Using viewports to render a 3d object (main character) in a 2d project seems to do the job I had in mind to a tee. I found these resources as examples:

Example project on the Godot Github:

Video explaining the process:

Among others. The documentation also talks about this process. However, every example I’ve found only uses GDScript. I went ahead and tried implementing this in a test project using C# instead. This is one version of the script I wrote:

public class test : Node2D
    Texture texture;
    Sprite screen;

    public override void _Ready()
        texture = (Texture)GetViewport().GetTexture();
        screen = (Sprite)GetNode("Screen");

    public override void _Process(float delta)
        screen.Texture = texture;

I believe that the above should do effectively the same thing as the GDScript examples, however the results are pretty bizarre. It’s tough to describe what it looks like on running it, but with the project otherwise built exactly the same way as the YouTube example, the place-holder images glitch and slide across the screen in pieces, with no sign of the 3d object at all. I’ve tried building the code and the project a few different ways and playing with a lot of options in the editor, but always with the same result. It’s as if the texture from the viewport doesn’t read properly in or out of video memory? Or maybe something in the bindings to cast a ViewportTexture object to Sprite.Texture doesn’t work as I expect?

Just to confirm; I rebuilt the project in GDScript as well and it worked perfectly.

I’m pretty dead-set on continuing development in C#, but not sure I can without access to this technique or a similar one (I’ve built many of the other game mechanics in C# already). Does anyone know if this is a bug or am I scripting this incorrectly? I hesitate to open an issue on Github until I know that the error isn’t mine (and I really hope it is so I can move forward!)

Won’t GetViewport() be returning the main viewport your node is in?

Having a quick skim through the example code, it’s using a separate viewport (defined on line 10 of https://github.com/godotengine/godot-demo-projects/blob/master/viewport/3d_in_2d/3d_in_2d.gd)

Do you have your broken example uploaded anywhere?

MitchReidNZ | 2020-05-20 05:04

:bust_in_silhouette: Reply From: MitchReidNZ

Yeah, definitely a copy/paste error :slight_smile:

Update the first line of your _Ready() method to use the Viewport that contains the 3d model instead of the parent viewport:
texture = (Texture)((Viewport)GetNode("Viewport")).GetTexture();

Thanks so much for the help!

Makes a lot of sense of what I was seeing when I ran it; it was trying to slap a texture of it’s self over it’s self every frame.

Not the first time I get brain freeze when looking at GDScript methods, then trying to spit out C#… I should have taken a step back and looked more carefully at what the methods I was calling actually did (especially before panicking lol!) :slight_smile:

jayCgee | 2020-05-20 10:58