# What ANGLE means in your WebGL renderer string

> ANGLE is the layer Chrome uses to turn WebGL into Direct3D, Metal or OpenGL. The backend it names in the renderer string tells a site your operating system.

Source: https://mosaicbrowser.com/blog/angle-in-webgl-renderer

## What ANGLE means in your WebGL renderer string

ANGLE is the layer Chrome uses to turn WebGL into Direct3D, Metal or OpenGL. The backend it names in the renderer string tells a site your operating system.

![Direct3D11, Metal or OpenGL: the word that names your OS](https://mosaicbrowser.com/covers/angle-in-webgl-renderer.webp)

ANGLE in a WebGL renderer string is the translation layer Chrome draws WebGL through. ANGLE stands for Almost Native Graphics Layer Engine: it takes the OpenGL ES calls WebGL makes and turns them into Direct3D on Windows, Metal on a Mac, and OpenGL or Vulkan elsewhere. The renderer string names that backend, so it tells a site which operating system you run, separately from what the User-Agent claims.

## What is ANGLE in a WebGL renderer, exactly

WebGL is a browser version of OpenGL ES. Most operating systems do not offer OpenGL ES to desktop applications, and Windows in particular never shipped dependable OpenGL drivers for every card. ANGLE is Google's answer: an implementation of OpenGL ES written on top of whichever native API the machine does have. Chrome uses it for WebGL on every desktop platform, and ANGLE's shader translator also checks the shaders a page sends, so one set of rules decides what a WebGL program may do.

When a page asks for the renderer with `getParameter(UNMASKED_RENDERER_WEBGL)`, from the `WEBGL_debug_renderer_info` extension, ANGLE builds the answer from three things: its own name, what the driver says the card is, and the backend it chose. The vendor string beside it reads `Google Inc. (NVIDIA)` or similar, because ANGLE is a Google project wrapping somebody else's hardware.

Mosaic is a desktop app

Email yourself the link and open it on your computer.

[How it works: Machines that exist](https://mosaicbrowser.com/features/real-fingerprints)

## How to read the renderer string, platform by platform

These are real strings, as browsers report them, taken from the table our device catalogue is checked against.

On Windows, ANGLE translates to Direct3D 11:

```
ANGLE (Intel, Intel(R) UHD Graphics 620 (0x00005917) Direct3D11 vs_5_0 ps_5_0, D3D11)

```

`Direct3D11` is the backend, and `vs_5_0 ps_5_0` are the vertex and pixel shader models a Direct3D 11 card exposes. The bracketed hex is the PCI device id, which ANGLE reads from the driver. Very old Windows machines report Direct3D 9 instead, with `Direct3D9Ex vs_3_0 ps_3_0` and the driver's DLL name at the end.

On a Mac with Apple silicon, ANGLE translates to Metal:

```
ANGLE (Apple, ANGLE Metal Renderer: Apple M2, Unspecified Version)

```

There is no device id and no shader model, only the chip's name. Some older Intel Macs still report ANGLE's OpenGL backend, in a shape only macOS produces: `ANGLE (Intel Inc., Intel Iris Pro OpenGL Engine, OpenGL 4.1)`. OpenGL 4.1 is where Apple froze its OpenGL support, and "OpenGL Engine" is how Apple's drivers name themselves.

On Linux, ANGLE runs over the system's OpenGL, and the string carries the driver's own spelling:

```
ANGLE (NVIDIA Corporation, NVIDIA GeForce RTX 3090/PCIe/SSE2, OpenGL 4.5.0)
ANGLE (AMD, AMD Radeon Graphics (radeonsi renoir ACO), OpenGL 4.6)

```

`NVIDIA Corporation` with `/PCIe/SSE2` is the proprietary NVIDIA driver; `radeonsi` and `ACO` or an LLVM version are Mesa, the open-source driver stack. Android phones report `OpenGL ES 3.2` with a mobile GPU such as Adreno or Mali, and some Linux machines end in `OpenGL ES 3.2` too, so that last suffix alone does not separate the two.

## Why the backend announces the operating system

`Direct3D11` exists on Windows and nowhere else. `ANGLE Metal Renderer` exists on macOS and nowhere else. A Mesa build string exists on Linux. None of this comes from the User-Agent or from `navigator.platform`; it comes from the graphics stack, so it is a second, independent statement of the OS.

That makes it the first thing a consistency check compares. A browser that says Windows in its User-Agent and Metal in its renderer has contradicted itself in two calls, and no ordinary machine produces that pair. The same goes for subtler mismatches: a Direct3D 11 string with no device id is a shape no driver emits, and when we checked our own hand-typed Windows rows, [41 of 45 were missing that id](https://mosaicbrowser.com/blog/hand-written-renderer-strings).

The renderer is also not the only place the backend shows. Each backend reports its own capability limits and shader precisions, and Pixelscan alone reads [sixty WebGL fields](https://mosaicbrowser.com/blog/pixelscan-sixty-webgl-fields). Change the renderer text and leave those alone, and the string disagrees with the numbers beside it. WebGPU is a third route: `navigator.gpu` describes the adapter directly, and its vendor has to match the vendor inside the WebGL string. That pair is a row in our detection catalogue.

A few strings mean no GPU at all. `Microsoft Basic Render Driver` on Windows and `SwiftShader`, Chrome's own fallback on any platform, are software rasterisers. They are honest strings from virtual machines, remote desktops and headless bots, which is a large share of automated traffic, and a profile that reports one looks like that population.

## How Mosaic keeps the renderer and the platform in agreement

Mosaic draws each profile's GPU from a catalogue of real machines, together with its screen, CPU threads and memory, so the renderer string belongs to the same machine as everything else the profile claims. Every renderer the catalogue can emit has to appear in a table of strings observed on real browsers, and our build refuses any row that is not there. The value is set inside Tesseract Chrome, our own Chromium, so every page, frame and worker reads the same string, and no script layered on top can disagree with it. (One more trap: the renderer can come back empty on a fresh WebGL context; [the null `UNMASKED_RENDERER_WEBGL` post](https://mosaicbrowser.com/blog/webgl-debug-renderer-info-fresh-context) has the cause.) How the machines are chosen is on the [real fingerprints page](https://mosaicbrowser.com/features/real-fingerprints).

## Questions

### What does ANGLE stand for in a WebGL renderer?

Almost Native Graphics Layer Engine. It is an open-source Google project that implements OpenGL ES, the API WebGL is built on, on top of whatever graphics API the operating system offers.

### Why does my WebGL renderer say ANGLE instead of my graphics card?

Because Chrome draws WebGL through ANGLE, so the string describes the whole path: ANGLE, the GPU vendor, the card as the driver names it, and the backend ANGLE translates to. Your card is inside the brackets.

### What does Direct3D11 vs_5_0 ps_5_0 mean?

ANGLE is translating WebGL into Direct3D 11, and vs_5_0 and ps_5_0 are the vertex and pixel shader models it uses. That backend exists only on Windows, so the string says Windows as plainly as a User-Agent does.

### Is Microsoft Basic Render Driver in the renderer string a problem?

It means there is no hardware GPU behind WebGL, only Windows' software rasteriser. Real desktops rarely report it; virtual machines, remote desktop sessions and many bots do, which is why sites treat it as a signal.

### Can a page read the renderer string without the debug extension?

The unmasked renderer comes from the WEBGL_debug_renderer_info extension, which Chrome exposes to every page. Without it a page still sees WebGL's capability limits and shader precisions, which also differ by backend.

## Related

[41 of 45 hand-written Windows renderer strings were wrong](https://mosaicbrowser.com/blog/hand-written-renderer-strings): Chrome's ANGLE Direct3D11 renderer string carries the GPU's PCI device id. Our hand-typed Windows rows left it out, a string no real driver produces.

[UNMASKED_RENDERER is null until a page asks for it](https://mosaicbrowser.com/blog/webgl-debug-renderer-info-fresh-context): Chrome returns null for the unmasked WebGL renderer until the page calls getExtension, so a spoof that answers it earlier is a two-line tell.

[Pixelscan reads sixty WebGL fields, and the renderer string is one](https://mosaicbrowser.com/blog/pixelscan-sixty-webgl-fields): Pixelscan's WebGL fingerprint is a render hash plus about sixty driver fields beside the renderer string. A chip that never existed failed like a real one.

[Machines that exist: fingerprints drawn from real hardware](https://mosaicbrowser.com/features/real-fingerprints): Mosaic draws each profile's GPU, screen, CPU, memory and fonts from one real device, so the parts of a fingerprint agree with each other and with the host.

[Why every Mac's Chrome says Mac OS X 10_15_7](https://mosaicbrowser.com/blog/mac-os-x-10-15-7): Chrome froze the macOS version in its User-Agent, so every Mac claims 10.15.7. The real one is in Sec-CH-UA-Platform-Version, a hint sites must ask for.

[Why the User-Agent says Windows 10 on Windows 11](https://mosaicbrowser.com/blog/windows-11-user-agent-windows-10): Windows 11 and 10 both send Windows NT 10.0 in the User-Agent. Only the platformVersion client hint, 13 or higher, says Windows 11.

[Why Chrome's User-Agent says 0.0.0](https://mosaicbrowser.com/blog/chrome-user-agent-0-0-0): Chrome zeroes everything after the major, so the User-Agent says 0.0.0 and the build moves to Sec-CH-UA-Full-Version-List. A real build in the UA is a tell.

[Privacy Sandbox is retired, and its APIs are a version tell](https://mosaicbrowser.com/blog/privacy-sandbox-apis-removed): Chrome is removing Topics and Protected Audience release by release, so whether runAdAuction exists tells a page which Chrome you really are.

## Mosaic, on your own computer

The browser this blog is about: its own Chromium, fingerprints from real machines and a proxy exit per profile. Free holds 3 profiles. Pro is $49 a month for any number.

Mosaic is a desktop app

Email yourself the link and open it on your computer.
