Ansichtsfenster

Einführung

Stellen Sie sich ein Viewport als einen Bildschirm vor, auf den das Spiel projiziert wird. Um das Spiel zu sehen brauchen wir eine Oberfläche auf der wir es zeichnen können. Diese Oberfläche ist das Wurzel-Viewport.

../../_images/viewportnode.png

Viewports können der Szene auch hinzugefügt werden, sodass mehrere Oberflächen zum Zeichnen vorhanden sind. Wenn wir auf einem Viewport zeichnen das nicht die Wurzel ist, nennen wir es ein Renderziel. Wir können auf den Inhalt eines Renderziels zugreifen, indem wir hierauf texture zugreifen. Wenn Sie ein Viewport als Renderziel verwenden, können Sie entweder mehrere Szenen gleichzeitig rendern, oder wir können ein texture rendern, das auf ein Objekt in der Szene angewendet wird, zum Beispiel eine dynamische Skybox.

Viewports haben viele Nutzungsmöglichkeiten, inklusive:

  • Rendern von 3D-Objekten in einem 2D-Spiel
  • Rendern von 2D-Elementen in einem 3D-Spiel
  • Dynamische Texturen rendern
  • Prozedurale Texturen zur Laufzeit generieren
  • Rendern mehrerer Kameras in derselben Szene

Allen diesen Anwendungsfällen ist gemeinsam, dass Sie Objekte auf eine Textur zeichnen können als wäre es ein anderer Bildschirm und dann auswählen können, was mit der resultierenden Textur geschehen soll.

Eingang

Viewports sind auch dafür verantwortlich, dass alle untergeordneten Nodes ordnungsgemäß angepasste und skalierte Eingabeereignisse erhalten. In der Regel wird die Eingabe vom nächsten Viewport im Baum empfangen, aber Sie können festlegen, dass Viewports keine Eingabe empfangen, indem Sie 'Disable Input' auf 'on' aktivieren; Dadurch kann der nächstgelegene Viewport im Baum die Eingabe erfassen.

../../_images/input.png

Für weitere Informationen dazu, wie Godot Eingaben verarbeitet, siehe InputEvent Tutorial.

Listener

Godot unterstützt 3D Sound (sowohl in 2D als auch in 3D Nodes). Weitere Informationen hierzu finden Sie im Audio Streams Anleitung. Damit diese Art von Sound zu hören ist, muss Viewport als Listener aktiviert sein (für 2D oder 3D). Wenn Sie ein benutzerdefiniertes Viewport verwenden, um Ihre Welt anzuzeigen, vergessen Sie nicht, dies zu aktivieren!

Kameras (2D & 3D)

Bei Verwendung von Camera / Camera2D werden Kameras immer auf dem nächstgelegenen übergeordneten Element angezeigt Viewport (in Richtung Wurzel). Zum Beispiel in der folgenden Hierarchie:

../../_images/cameras.png

CameraA wird im Wurzel Viewport angezeigt und zeichnet MeshA. CameraB wird vom Viewport-Node zusammen mit MeshB erfasst. Obwohl sich MeshB in der Szenenhierarchie befindet, wird es dennoch nicht im Wurzel :ref: Viewport <class_Viewport> gezeichnet. In ähnlicher Weise ist MeshA vom Viewport-Node nicht sichtbar, da Viewport-Nodes nur Nodes unter ihnen in der Hierarchie erfassen.

Es kann nur eine aktive Kamera pro Viewport geben. Wenn also mehr als eine vorhanden ist, stellen Sie sicher, dass für die gewünschte Kamera die Eigenschaft "current" festgelegt ist, oder machen Sie sie zur aktuellen Kamera, indem Sie Folgendes aufrufen:

camera.make_current()

Standardmäßig rendern Kameras alle Objekte in ihrer Welt. In 3D können Kameras ihre Eigenschaft cull_mask in Kombination mit der Eigenschaft VisualInstance layer verwenden, um zu beschränken, welche Objekte gerendert werden.

Skalieren & Dehnen

Viewports haben eine "size"-Eigenschaft, die die Größe des Viewport in Pixel darstellt. Für Viewports die untergeordnete Elemente von ViewportContainers sind, werden diese Werte überschrieben, für alle anderen wird jedoch ihre Auflösung festgelegt.

Es ist auch möglich den 2D Inhalt zu skalieren und die Viewport Auflösung von der in der Größe angegebenen Auflösung zu unterscheiden, indem Sie Folgendes aufrufen:

viewport.set_size_override(true, Vector2(width, height)) # Custom size for 2D.
viewport.set_size_override_stretch(true) # Enable stretch for custom size.

Der Wurzel Viewport verwendet dies für die Stretch-Optionen in den Projekteinstellungen. Weitere Informationen zum Skalieren und Dehnen finden Sie in der Anleitung für mehrere Auflösungen.

Welten

Für 3D enthält ein Viewport eine World. Dies ist im Grunde das Universum, das Physik und Rendering miteinander verbindet. Raumbasierte Nodes registrieren sich mit World des nächstgelegenen Viewport. Standardmäßig enthält das neu erstellte Verzeichnis Viewports keine World, verwendet jedoch dasselbe wie das übergeordnete Viewport Element (der Wurzel :ref:` Viewport <class_Viewport> enthält immer eine :ref: World <class_World> , welches das Objekt ist, für das standardmäßig gerendert wird). Eine :ref:`World <class_World> kann in einem Viewport mithilfe der Eigenschaft "world" festgelegt werden. Dadurch werden alle untergeordneten Nodes dieses Viewport von Interaktionen mit dem übergeordneten Element Viewport World getrennt. Dies ist besonders nützlich in Szenarien, in denen Sie beispielsweise einen separaten Charakter in 3D anzeigen möchten, der über das Spiel festgelegt wurde (wie in StarCraft).

Als Hilfsmittel für Situationen, in denen Sie ein Viewport, der einzelne Objekte anzeigen und keine World erstellen möchten, hat Viewport die Möglichkeit eine eigene World zu verwenden. Dies ist nützlich, wenn Sie 3D Zeichen oder Objekte in einer 2D World Instanz instanziieren möchten.

Für 2D enthält jeder Viewport immer ein eigenes World2D. Dies reicht in den meisten Fällen aus, aber falls eine gemeinsame Nutzung gewünscht wird, können Sie dies manuell durch Viewport World2D festlegen.

Ein Beispiel dafür finden Sie in den Demo-Projekten 3D in 2D und `2D in 3D <https : //github.com/godotengine/godot-demo-projects/tree/master/viewport/2d_in_3d> `_.

Aufnahme

Es ist möglich, eine Erfassung des Inhalts von Viewport abzufragen. Für den Wurzel Viewport ist dies effektiv eine Bildschirmaufnahme. Dies geschieht mit folgendem Code:

# Retrieve the captured Image using get_data().
var img = get_viewport().get_texture().get_data()
# Flip on the Y axis.
# You can also set "V Flip" to true if not on the root Viewport.
img.flip_y()
# Convert Image to ImageTexture.
var tex = ImageTexture.new()
tex.create_from_image(img)
# Set Sprite Texture.
$sprite.texture = tex

Wenn Sie dies jedoch in _ready () oder ab dem ersten Frame der Viewport's Initialisierung verwenden, erhalten Sie eine leere Textur, da nichts für eine Textur da ist. Sie können dies beispielsweise so handhaben:

# Wait until the frame has finished before getting the texture.
yield(VisualServer, "frame_post_draw")
# You can get the image after this.

Viewport Container

If the Viewport is a child of a ViewportContainer, it will become active and display anything it has inside. The layout looks like this:

../../_images/container.png

The Viewport will cover the area of its parent ViewportContainer completely if Stretch is set to true in ViewportContainer. Note: The size of the ViewportContainer cannot be smaller than the size of the Viewport.

Rendering

Due to the fact that the Viewport is an entryway into another rendering surface, it exposes a few rendering properties that can be different from the project settings. The first is MSAA; you can choose to use a different level of MSAA for each Viewport; the default behavior is DISABLED. You can also set the Viewport to use HDR, HDR is very useful for when you want to store values in the texture that are outside the range 0.0 - 1.0.

If you know how the Viewport is going to be used, you can set its Usage to either 3D or 2D. Godot will then restrict how the Viewport is drawn to in accordance with your choice; default is 3D. The 2D usage mode is slightly faster and uses less memory compared to the 3D one. It's a good idea to set the Viewport's Usage property to 2D if your viewport doesn't render anything in 3D.

Bemerkung

If you need to render 3D shadows in the viewport, make sure to set the viewport's Shadow Atlas Size property to a value higher than 0. Otherwise, shadows won't be rendered. For reference, the Project Settings define it to 4096 by default.

Godot also provides a way of customizing how everything is drawn inside Viewports using “Debug Draw”. Debug Draw allows you to specify one of four options for how the Viewport will display things drawn inside it. Debug Draw is disabled by default.

../../_images/default_scene.png

A scene drawn with Debug Draw disabled

The other three options are Unshaded, Overdraw, and Wireframe. Unshaded draws the scene without using lighting information so all the objects appear flatly colored the color of their albedo.

../../_images/unshaded.png

The same scene with Debug Draw set to Unshaded

Overdraw draws the meshes semi-transparent with an additive blend so you can see how the meshes overlap.

../../_images/overdraw.png

The same scene with Debug Draw set to Overdraw

Lastly, Wireframe draws the scene using only the edges of triangles in the meshes.

Bemerkung

The effects of the Wireframe mode are only visible in the editor, not while the project is running.

Render target

When rendering to a Viewport, whatever is inside will not be visible in the scene editor. To display the contents, you have to draw the Viewport's ViewportTexture somewhere. This can be requested via code using (for example):

# This gives us the ViewportTexture.
var rtt = viewport.get_texture()
sprite.texture = rtt

Or it can be assigned in the editor by selecting "New ViewportTexture"

../../_images/texturemenu.png

and then selecting the Viewport you want to use.

../../_images/texturepath.png

Every frame, the Viewport's texture is cleared away with the default clear color (or a transparent color if Transparent Bg is set to true). This can be changed by setting Clear Mode to Never or Next Frame. As the name implies, Never means the texture will never be cleared, while next frame will clear the texture on the next frame and then set itself to Never.

By default, re-rendering of the Viewport happens when the Viewport's ViewportTexture has been drawn in a frame. If visible, it will be rendered; otherwise, it will not. This behavior can be changed to manual rendering (once), or always render, no matter if visible or not. This flexibility allows users to render an image once and then use the texture without incurring the cost of rendering every frame.

Make sure to check the Viewport demos! Viewport folder in the demos archive available to download, or https://github.com/godotengine/godot-demo-projects/tree/master/viewport