SDL GPU won't help you to start. compare it to the amount of stuff you have to do to even draw on screen it's just plain madness. It's there for some portability between Vulkan, DX12 and Metal but this is still an absolute insanity of a setup and management for simple graphics. Just ignore it until you learn something simpler first, it's not worth the effort.
I believe OpenGL ES 3.1 is the graphics API that you should start with. Maybe even OpenGL ES 2.0, and once you learn it you can iterate over the new features until you reach ES 3.1.
Anecdode: Once I tried to implement multiple textures into my batching renderer and turned out this is slightly problematic in OpenGL ES. apparently you can't use int attributes, you have to pass natural indices as floats. There were some inconsistencies with GLSL features between platforms, so I could not use switch nor index an uniform array with non-constant attribute.
varying vec2 v_uv;
varying float v_texture;
uniform sampler2D s_texture[8];
vec4 color;
int texture = int(v_texture);
if (texture < 0) color = vec4(1.0, 1.0, 1.0, 1.0);
else if (texture == 0) color = texture2D(s_texture[0], v_uv);
else if (texture == 1) color = texture2D(s_texture[1], v_uv);
else if (texture == 2) color = texture2D(s_texture[2], v_uv);
else if (texture == 3) color = texture2D(s_texture[3], v_uv);
else if (texture == 4) color = texture2D(s_texture[4], v_uv);
else if (texture == 5) color = texture2D(s_texture[5], v_uv);
else if (texture == 6) color = texture2D(s_texture[6], v_uv);
else if (texture == 7) color = texture2D(s_texture[7], v_uv);
else color = vec4(1.0, 1.0, 1.0, 1.0);
and I still don't understand how the texture binding works. I think I understood it for the few minutes I wrote the code and just forgot it all the next time I fell asleep. you have to glActiveTexture(GL_TEXTURE0 + i), then glBindTexture(GL_TEXTURE_2D, id) and then also set sampler2D uniform to that GL_TEXTURE0+i ??? what an odd indirection
or use raylib