Web 3D - WebGL, WebGPU und Frameworks kurz erklärt

3D Darstellung einer Libelle deren Flügel mit einer Kurbel angetrieben werden

In diesem Artikel möchten wir eine kurze Übersicht über WebGL und den Nachfolger WebGPU geben. Mit beiden Technologien lassen sich hardwarebeschleunigte 2D und 3D Echtzeit-Grafikanwendungen wie Spiele, Konfiguratoren, geografische Karten etc. im Browser realisieren. Hardwarebeschleunigung bedeutet hier die direkte Nutzung des Grafikprozessors (GPU). GPUs sind für die parallele Verarbeitung von großen Datenmengen ausgelegt. Sie verfügen über viele einfache Prozessoren (Shader-Einheiten), die gleichzeitig verschiedene Berechnungen durchführen können.

WebGL

WebGL ist eine von der Khronos Group entwickelte API für 2D- und 3D-Grafikrendering in Browsern.

OpenGL ES (OpenGL for Embedded Systems) sind spezielle Versionen der OpenGL-Spezifikation, optimiert für den Einsatz in Mobilgeräten, Spielekonsolen und anderen eingebetteten Geräten.

WebGPU

WebGPU, eine leistungsstarke Grafikschnittstelle, wird die Nachfolge von WebGL antreten. Sie wurde speziell für die Nutzung im Web konzipiert ist und von den Schnittstellen Vulkan (Khronos), Metal (Apple) und Direct3D 12 (Microsoft) abgeleitet. Eine Übersicht der aktuellen Browserunterstützung ist auf caniuse abrufbar.

WebGPU bietet neben Geschwindigkeitsverbesserungen erstmals die Möglichkeit, Compute-Shader in Browsern auszuführen. Compute-Shader sind spezielle Programme, die auf Grafikprozessoren ausgeführt werden und zur Durchführung von allgemeinen Berechnungen verwendet werden, die nicht unbedingt mit der Grafikdarstellung zusammenhängen. Interessant für Anwendungen wie physikalische Simulationen, Bild- und Signalverarbeitung, maschinelles Lernen etc.

Frameworks

WebGL und WebGPU sind Low-Level-Grafik-APIs. Da diese komplex sind, werden oft Frameworks eingesetzt, die die Entwicklung vereinfachen und eine höhere Abstraktionsebene bieten, indem sie nützliche Funktionen und Tools bereitstellen.

Das sind unter anderem:

Zu den bekanntesten Frameworks auf dem Gebiet zählen Babylon.js und Three.js.

glTF Format

glTF (GL Transmission Format) auch als "JPEG of 3D" bezeichnet, ist ein offenes Dateiformat für die Übertragung und Speicherung von 3D-Modellen und Texturen. Es wird von der Khronos Group entwickelt und ist zu einem Standard für 3D-Inhalte im Web geworden.

Das Format kann in JSON/ASCII (.gltf) und Binärdateien (.glb) gespeichert werden und unterstützt Erweiterungen wie PBR für realistische Materialien und Beleuchtung sowie Draco-Kompression für effiziente Geometrie- und Textur-Komprimierung.

glTF-Blender-IO ist ein standardmäßig in Blender enthaltenes Addon, das das Importieren und Exportieren von 3D-Modellen in glTF ermöglicht. Es wird unter dem Dach von Khronos entwickelt und ist die umfangreichste Implementierung für das Arbeiten mit dem Format.

Beispiel

Hier zeigen wir ein WebGL-Minimalbeispiel mit Babylon.js. Einer Szene werden eine ArcRotate-Kamera, ein Punkt-Licht und Geometrie aus einer glTF-Datei hinzugefügt.

createScene = function () {
  // neue Szene erstellen
  const scene = new BABYLON.Scene(engine);

  // Wir erstellen eine ArcRotate-Kamera mit alpha, beta, radius. Ziel: Szenen-Mittelpunkt (0,0,0)
  const camera = new BABYLON.ArcRotateCamera("Camera", 0.9, 0.8, 1.8, BABYLON.Vector3.Zero(), scene);
  camera.wheelPrecision = 100; // Zoom-Sensitivität des Mausrades
  camera.minZ = 0.001; // Clipping Plane
  camera.attachControl(canvas); // Kamerasteuerung an das canvas-Element binden

  // Punkt-Lichtquelle mit Position erzeugen
  const light = new BABYLON.PointLight("light", new BABYLON.Vector3(0, 1, 0), scene);
  light.intensity = 4; // Intensivität der Lichtquelle

  // Die aus Blender exportierte glTF Geometrie laden
  const loader = new BABYLON.SceneLoader.Append("./", "logo.glb", scene);

  return scene;
};

const canvas = document.getElementById("renderCanvas"); // canvas-Element
const engine = new BABYLON.Engine(canvas); // Babylon.js
const scene = createScene(); // Szene erstellen - siehe oben

// RenderLoop: Zeichnet die Szene ständig neu.
engine.runRenderLoop(function () {
  scene.render();
});

// Passt die Ansicht an die Größe des canvas-Elements an
window.addEventListener("resize", function () {
  engine.resize();
});

Das war's auch schon! 🤓 Hier das .

In unserer Demo gibt es eine Skybox als Hintergrund, ein HDR-Environment zur zusätzlichen Beleuchtung, Schatten und einige Post-Effekte wie Tonemapping.

Natürlich haben wir hier nur an der Oberfläche gekratzt. Wenn ihr Fragen oder Anregungen zu diesem Beitrag habt, schreibt uns an: office@fatvalley.at !