Texture access from Fragment Shader by id

Hi, i’m trying to render my scene also with OpenGL.
Already succeed to render to FBO (offscreen) etc.
But i need one more thing.
To get some insight to what i’m doing, lets say, i need to render N number of spheres.
I don’t want to render each separately - because as i read in some tutorial:
“The first idea to draw many particles would be to use the previous tutorial’s code, and call glDrawArrays once for each particle. This is a very bad idea, because this means that all your shiny GTX’ 512+ multiprocessors will all be dedicated to draw ONE quad (obviously, only one will be used, so that’s 99% efficiency loss).”
Since every particle use the same mesh (meshed sphere) i’d like to grab them into one buffer and render with “Instanced” draw.
So far - no problem occured. The problem is, that all sphere may have different material, and… texture…
I know how to make those sphere have different materials, but i have no idea how to do something like this in Fragment Shader:


#version 330 core

in vec4 position;
in vec2 coords;
in int    material_id
in int    texture_id;

uniform vec4 diffuse[10];

out vec4 color;

void main() {
	color = diffuse[material_id]*texture( [how to ?] texture_id, coords);
}

In other words, i just want to use any created texture from a shader without binding it like:

uniform sampler2D diff_tex;

and somewhere in host code:


int d_tex_loc = glGetUniformLocation(program,"diff_tex");
glUniform1i(d_tex_loc,5);

and before rendering:


glActiveTexture(GL_TEXTURE5);
glBindTexture(GL_TEXTURE_2D, my_texture);

For now, the only way i see is to bind all textures [or at least those which i’ll use during Instanced draw]
But the question is: can i access texture loaded on GPU without binding it?
This would be much more easier for me… i could then just send texture id and access it.

i just want to use any created texture from a shader without binding it

Not unless your graphics card supports ARB_bindless_texture. You can simulate this by using an array texture, with the array layers being for different objects. You simply pass the array layer to the texture.

I think i’m gonna love you! Not sure yet, but probably problem is solved. Thank U :slight_smile: