Signatur
Beschreibung
Mit blendColor() legt man eine konstante Farbe fest, auf die die Blending-Stufe von WebGL zugreifen kann. Die MDN-Kurzbeschreibung, laut der hier die Quell- und Ziel-Mischfaktoren gesetzt werden, stimmt so nicht ganz: Diese Faktoren legt man mit blendFunc() bzw. blendFuncSeparate() fest. blendColor() gibt nur den Farbwert vor, den die Faktoren gl.CONSTANT_COLOR, gl.ONE_MINUS_CONSTANT_COLOR, gl.CONSTANT_ALPHA und gl.ONE_MINUS_CONSTANT_ALPHA verwenden.
Typische Einsätze sind globale Überblendungen (z. B. ein ganzes Objekt mit 30 % Deckkraft zeichnen, ohne den Shader oder die Texturen zu ändern), Einfärben (Tint) über einen konstanten Farbfaktor und Ein- und Ausblend-Übergänge zwischen zwei Szenen. Die Konstante ist Teil des globalen WebGL-Zustands. Sie gilt also für alle folgenden Zeichenaufrufe, bis man sie erneut setzt.
Damit die Farbe überhaupt wirkt, muss Blending mit gl.enable(gl.BLEND) eingeschaltet sein, und blendFunc()/blendFuncSeparate() muss einen der konstanten Faktoren verwenden. Der aktuelle Wert lässt sich mit gl.getParameter(gl.BLEND_COLOR) auslesen. Voreingestellt ist [0, 0, 0, 0].
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $red Pflicht | number (GLclampf) | 0 | Rot-Anteil der konstanten Mischfarbe, 0 bis 1. |
| $green Pflicht | number (GLclampf) | 0 | Grün-Anteil der konstanten Mischfarbe, 0 bis 1. |
| $blue Pflicht | number (GLclampf) | 0 | Blau-Anteil der konstanten Mischfarbe, 0 bis 1. |
| $alpha Pflicht | number (GLclampf) | 0 | Alpha-Anteil der konstanten Mischfarbe, 0 bis 1. Wird von CONSTANT_ALPHA und ONE_MINUS_CONSTANT_ALPHA verwendet. |
Rückgabewert
Beispiele
Objekt mit globaler Deckkraft zeichnen
const canvas = document.querySelector('canvas');
const gl = canvas.getContext('webgl');
// Blending aktivieren und die konstante Alpha als Faktor verwenden
gl.enable(gl.BLEND);
gl.blendColor(0, 0, 0, 0.3); // 30 % Deckkraft
gl.blendFunc(gl.CONSTANT_ALPHA, gl.ONE_MINUS_CONSTANT_ALPHA);
gl.clearColor(1, 1, 1, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
// ... Shader-Programm binden und gl.drawArrays(...) aufrufen
// Die Geometrie erscheint nun mit 30 % Deckkraft über dem Hintergrund.
Aktuelle Mischfarbe auslesen
const gl = document.createElement('canvas').getContext('webgl');
console.log(gl.getParameter(gl.BLEND_COLOR));
gl.blendColor(1, 0.5, 0.25, 1);
console.log(gl.getParameter(gl.BLEND_COLOR));
Szenenübergang: Einblenden über mehrere Frames
const gl = document.querySelector('canvas').getContext('webgl');
gl.enable(gl.BLEND);
gl.blendFunc(gl.CONSTANT_ALPHA, gl.ONE_MINUS_CONSTANT_ALPHA);
const drawScene = () => {
// ... Geometrie der neuen Szene zeichnen (gl.drawArrays/drawElements)
};
const start = performance.now();
const dauer = 1000; // 1 Sekunde
const frame = (now) => {
const t = Math.min((now - start) / dauer, 1);
gl.blendColor(0, 0, 0, t); // Deckkraft von 0 auf 1
drawScene();
if (t < 1) requestAnimationFrame(frame);
};
requestAnimationFrame(frame);
Einfärben mit einem konstanten Farbfaktor
const gl = document.querySelector('canvas').getContext('webgl');
gl.enable(gl.BLEND);
// Quellfarbe komponentenweise mit der Konstante multiplizieren (Rot-Stich)
gl.blendColor(1.0, 0.4, 0.4, 1.0);
gl.blendFunc(gl.CONSTANT_COLOR, gl.ZERO);
// ... gl.drawArrays(...) – gezeichnete Pixel erscheinen rötlich getönt
// Wichtig · Fallstricke
- Wirkt nur mit passenden Faktoren: Ohne
gl.enable(gl.BLEND)und ohne einenCONSTANT_*-Faktor inblendFunc()/blendFuncSeparate()hatblendColor()keine sichtbare Wirkung. - WebGL-1-Einschränkung: Wird
CONSTANT_COLORbzw.ONE_MINUS_CONSTANT_COLORals Quellfaktor undCONSTANT_ALPHAbzw.ONE_MINUS_CONSTANT_ALPHAals Zielfaktor verwendet (oder umgekehrt), löstblendFunc()den Fehlergl.INVALID_OPERATIONaus. Prüfen lässt sich das mitgl.getError(). - Wertebereich: Die Werte werden auf 0–1 begrenzt (
GLclampf). Werte außerhalb dieses Bereichs werden stillschweigend abgeschnitten. - Globaler Zustand: Die Konstante bleibt gesetzt, bis man sie neu setzt. Wer mehrere Render-Durchgänge oder Bibliotheken kombiniert, sollte sie vor jedem Zeichenaufruf gezielt setzen oder danach zurücksetzen.
- Vormultipliziertes Alpha: Ist der Canvas mit
premultipliedAlpha: trueangelegt (Standard), müssen die Farben dazu passen. Sonst entstehen beim Zusammensetzen mit der Seite helle oder dunkle Ränder. - Kompatibilität: Die Methode wird in allen modernen Browsern unterstützt und steht genauso in
WebGL2RenderingContextzur Verfügung.