Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Max number of textures in WebGL?

Tags:

webgl

I know that there is a limit of 8 textures in WebGL.

My question is that, is 8 the limit globally, or per shader/program wise?

If it's per shader/program wise limit, does that mean, once I load the textures to uniforms of one shader, I can start reusing these slots for other shaders? Say I used TEXTURE0 for one shape, can I use TEXTURE0 in another shape?

like image 958
Qiaosen Huang Avatar asked Dec 07 '16 14:12

Qiaosen Huang


People also ask

How many textures WebGL?

WebGL provides a minimum of 8 texture units; the first of these is gl. TEXTURE0 .

What are textures in WebGL?

Texture mapping maps a location in a 2D image to a location on a 3D triangle. WebGL uses texture coordinates to perform this mapping. As with so many other aspects of graphics, texture coordinates are percentages. The notation for texture coordinates uses (s,t) to represent an image location.

Does WebGL use shaders?

As mentioned in how it works WebGL requires 2 shaders every time you draw something. A vertex shader and a fragment shader. Each shader is a function. A vertex shader and fragment shader are linked together into a shader program (or just program).

What is sampler2D in WebGL?

sampler2D is just a way to get data from an array. Don't think of it as a texture. Think of it has a 2D array with special hardware to do interpolation between values in the array (LINEAR filtering) and values between mips. Set the sampling to NEAREST and they just become 2D arrays.


1 Answers

The limit is per draw call. When you make a draw call, and invoke a particular shader program, you are constrained by the limit, but your next draw call can use completely different textures in the same animation frame.

Also, 8 is just the minimum guarantee. Systems are required to support at least eight to be considered WebGL conformant. But nicer graphics cards support more than eight. You can query the max number of image textures for the platform you're on like this:

var maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);

You can also look for vertex textures:

gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS)

Or a combination of the two:

gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS)

You can also use a site like WebGL Report (Disclaimer, I'm a contributor) to look up this stat for the platform you're on (under Fragment Shader -> Max Texture Units).

EDIT: When this answer was first written, there was another useful site called "WebGL Stats" that would show aggregate data for WebGL support in a variety of browsers. Sadly, that site disappeared a couple years ago without warning. But even back then, most devices supported at least 16 textures.

like image 69
emackey Avatar answered Oct 08 '22 02:10

emackey