Start · Sprachen · JavaScript · Referenz · WebGLRenderingContext.drawingBufferColorSpace

WebGLRenderingContext.drawingBufferColorSpace

Eigenschaft

Liest oder setzt den Farbraum des WebGL-Zeichenpuffers, z. B. <code>"srgb"</code> (Standard) oder <code>"display-p3"</code> für einen erweiterten Farbumfang.

seit JavaScript Chrome/Edge 104+, Safari 16.4+; Firefox eingeschrä Kategorie: webapi

Signatur

WebGLRenderingContext.drawingBufferColorSpace

Beschreibung

Die Eigenschaft drawingBufferColorSpace legt fest, in welchem Farbraum der Browser die Pixel des WebGL-Zeichenpuffers interpretiert, wenn er die Canvas auf dem Bildschirm zusammensetzt. Standardmäßig ist das "srgb". Auf Geräten mit Wide-Gamut-Displays (etwa aktuelle MacBooks, iPhones oder viele OLED-Monitore) kannst du mit "display-p3" gesättigtere Farben darstellen, die außerhalb des sRGB-Farbumfangs liegen.

Die Eigenschaft ist les- und schreibbar und steht sowohl auf WebGLRenderingContext als auch auf WebGL2RenderingContext zur Verfügung. Der Wert gehört zum Aufzählungstyp PredefinedColorSpace, der auch bei CanvasRenderingContext2D (Option colorSpace) und ImageData verwendet wird.

Wichtig: Der Farbraum ändert nicht, wie deine Shader rechnen. Er bestimmt nur, wie die geschriebenen Werte angezeigt werden. Der Farbwert vec4(1.0, 0.0, 0.0, 1.0) ist bei "srgb" das sRGB-Rot, bei "display-p3" dagegen das deutlich kräftigere P3-Rot. Damit Texturen korrekt in den Zielfarbraum umgewandelt werden, gibt es die ergänzende Eigenschaft unpackColorSpace (bei WebGL 2 zusätzlich das Argument beim Hochladen).

Setze den Wert am besten direkt nach dem Erzeugen des Kontexts und vor dem ersten Zeichnen, denn beim Umschalten wird der Zeichenpuffer neu angelegt und sein Inhalt verworfen.

Parameter

Name Typ Default Beschreibung
$value "srgb" | "display-p3" "srgb" Neuer Farbraum beim Zuweisen. Ungültige Zeichenketten werden laut WebIDL stillschweigend ignoriert, es wird also kein Fehler geworfen.

Rückgabewert

Typ
string (PredefinedColorSpace)
Beschreibung
Der aktuelle Farbraum des Zeichenpuffers: "srgb" oder "display-p3". In Browsern ohne Unterstützung ist der Wert undefined.

Beispiele

Aktuellen Farbraum auslesen

const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');

if (gl && 'drawingBufferColorSpace' in gl) {
  console.log(gl.drawingBufferColorSpace);
} else {
  console.log('drawingBufferColorSpace wird nicht unterstützt');
}
srgb

Display-P3 nur bei passendem Bildschirm aktivieren

const canvas = document.querySelector('#scene');
const gl = canvas.getContext('webgl2');

const supportsP3 = window.matchMedia('(color-gamut: p3)').matches;

if (supportsP3 && 'drawingBufferColorSpace' in gl) {
  // Vor dem ersten Zeichnen setzen, beim Umschalten wird der Puffer neu angelegt
  gl.drawingBufferColorSpace = 'display-p3';
  gl.unpackColorSpace = 'display-p3';
}

console.log(`Farbraum: ${gl.drawingBufferColorSpace}`);

// Kräftiges P3-Rot als Hintergrund
gl.clearColor(1.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
Farbraum: display-p3 (auf einem P3-fähigen Gerät)

Setzen prüfen, weil ungültige Werte ignoriert werden

const gl = document.createElement('canvas').getContext('webgl');

const setColorSpace = (ctx, space) => {
  ctx.drawingBufferColorSpace = space;
  return ctx.drawingBufferColorSpace === space;
};

console.log(setColorSpace(gl, 'rec2020'));    // kein gültiger Wert
console.log(setColorSpace(gl, 'display-p3'));
console.log(gl.drawingBufferColorSpace);
false true display-p3

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Chromium-basierte Browser unterstützen die Eigenschaft ab Version 104, Safari ab 16.4. In Firefox ist die Unterstützung eingeschränkt. Teste die Verfügbarkeit mit 'drawingBufferColorSpace' in gl.
  • Inhalt geht verloren: Wenn du den Wert änderst, wird der Zeichenpuffer neu angelegt. Danach musst du die Szene neu zeichnen.
  • Kein Fehler bei ungültigen Werten: Werte wie "rec2020" werden ohne Meldung ignoriert. Lies den Wert nach dem Setzen zur Kontrolle aus.
  • Shader-Werte bleiben gleich: Deine Farbwerte werden nicht automatisch umgerechnet. Farben, die für sRGB abgestimmt sind, wirken in "display-p3" übersättigt. Lade Texturen deshalb mit passendem unpackColorSpace hoch.
  • Auf Bildschirmen ohne P3-Unterstützung werden P3-Farben auf den verfügbaren Farbumfang abgebildet (Gamut-Mapping). Frag das vorher mit matchMedia('(color-gamut: p3)') ab.
  • toDataURL() und readPixels() liefern die Rohwerte des Puffers. Beim Export kann ein Farbprofil fehlen oder vom Browser abhängen.