2

Is there a way to store signed 16bit value inside single channel?

Im trying to store it inside red channel like this:

  gl.texImage2D(gl.TEXTURE_2D, 0, gl.R16I, width, height, 0, gl.RED, gl.SHORT, image);

but it results in error:

[.WebGL-000022F401016900] GL_INVALID_OPERATION: Invalid combination of format, type and internalFormat.
Rabbid76
  • 202,892
  • 27
  • 131
  • 174
ffsa
  • 55
  • 5

1 Answers1

1

For integral data the format argument must be gl.RED_INTEGER:

gl.texImage2D(gl.TEXTURE_2D, 0, gl.R16I, width, height, 0, gl.RED, gl.SHORT, image);

gl.texImage2D(gl.TEXTURE_2D, 0, gl.R16I, width, height, 0, gl.RED_INTEGER, gl.SHORT, image);
Rabbid76
  • 202,892
  • 27
  • 131
  • 174
  • Thanks, it works. I have a followup question, do you know how can I get this channel in shader? `texture(u_image, v_texCoord).r;` results in `Mismatch between texture format and sampler type (signed/unsigned/float/shadow)` – ffsa Dec 10 '21 at 21:27
  • @ffsa The sampler type must be `isampler2D`. See [Sampler (GLSL)](https://www.khronos.org/opengl/wiki/Sampler_(GLSL)). In this case `texture(u_image, v_texCoord)` returns a `ivec4`. – Rabbid76 Dec 10 '21 at 21:32