Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7063627
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 28, 20262026-05-28T04:44:09+00:00 2026-05-28T04:44:09+00:00

From what I gather, glActiveTexture sets the active texture unit. Each texture unit can

  • 0

From what I gather, glActiveTexture sets the active “texture unit”. Each texture unit can have multiple texture targets (usually GL_TEXTURE_1D, 2D, 3D or CUBE_MAP).

If I understand correctly, you have to call glActiveTexture to set the texture unit first (initialized to GL_TEXTURE0), and then you bind (one or more) “texture targets” to that texture unit?

The number of texture units available is system dependent. I see enums for up to 32 in my library. I guess this essentially means I can have the lesser of my GPU’s limit (which I think is 16 8) and 32 textures in GPU memory at any one time? I guess there’s an additional limit that I don’t exceed my GPU’s maximum memory (supposedly 1 GB).

Am I understanding the relationship between texture targets and texture units correctly? Let’s say I’m allowed 16 units and 4 targets each, does that mean there’s room for 16*4=64 targets, or does it not work like that?

Next you typically want to load a texture. You can do this via glTexImage2D. The first argument of which is a texture target. If this works like glBufferData, then we essentially bind the “handle”/”texture name” to the texture target, and then load the texture data into that target, and thus indirectly associate it with that handle.

What about glTexParameter? We have to bind a texture target, and then choose that same target again as the first argument? Or does the texture target not need to be bound as long as we have the correct active texture unit?

glGenerateMipmap operates on a target too…that target has to still be bound to the texture name for it to succeed?

Then when we want to draw our object with a texture on it, do we have to both choose an active texture unit, and then a texture target? Or do we choose a texture unit, and then we can grab data from any of the 4 targets associated with that unit? This is the part that’s really confusing me.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-28T04:44:09+00:00Added an answer on May 28, 2026 at 4:44 am

    All About OpenGL Objects

    The standard model for OpenGL objects is as follows.

    Objects have state. Think of them as a struct. So you might have an object defined like this:

    struct Object
    {
        int count;
        float opacity;
        char *name;
    };
    

    The object has certain values stored in it and it has state. OpenGL objects have state too.

    Changing State

    In C/C++, if you have an instance of type Object, you would change its state as follows: obj.count = 5; You would directly reference an instance of the object, get the particular piece of state you want to change, and shove a value into it.

    In OpenGL, you don’t do this.

    For legacy reasons better left unexplained, to change the state of an OpenGL object, you must first bind it to the context. This is done with some from of glBind* call.

    The C/C++ equivalent to this is as follows:

    Object *g_objs[MAX_LOCATIONS] = {NULL};    
    void BindObject(int loc, Object *obj)
    {
      g_objs[loc] = obj;
    }
    

    Textures are interesting; they represent a special case of binding. Many glBind* calls have a "target" parameter. This represents different locations in the OpenGL context where objects of that type can be bound. For example, you can bind a framebuffer object for reading (GL_READ_FRAMEBUFFER) or for writing (GL_DRAW_FRAMEBUFFER). This affects how OpenGL uses the buffer. This is what the loc parameter above represents.

    Textures are special because when you first bind them to a target, they get special information. When you first bind a texture as a GL_TEXTURE_2D, you are actually setting special state in the texture. You are saying that this texture is a 2D texture. And it will always be a 2D texture; this state cannot be changed ever. If you have a texture that was first bound as a GL_TEXTURE_2D, you must always bind it as a GL_TEXTURE_2D; attempting to bind it as GL_TEXTURE_1D will give rise to an error (while run-time).

    Once the object is bound, its state can be changed. This is done via generic functions specific to that object. They too take a location that represents which object to modify.

    In C/C++, this looks like:

    void ObjectParameteri(int loc, ObjectParameters eParam, int value)
    {
      if(g_objs[loc] == NULL)
        return;
    
      switch(eParam)
      {
        case OBJECT_COUNT:
          g_objs[loc]->count = value;
          break;
        case OBJECT_OPACITY:
          g_objs[loc]->opacity = (float)value;
          break;
        default:
          //INVALID_ENUM error
          break;
      }
    }
    

    Notice how this function sets whatever happens to be in currently bound loc value.

    For texture objects, the main texture state changing functions are glTexParameter. The only other functions that change texture state are the glTexImage functions and their variations (glCompressedTexImage, glCopyTexImage, the recent glTexStorage). The various SubImage versions change the contents of the texture, but they do not technically change its state. The Image functions allocate texture storage and set the texture’s format; the SubImage functions just copy pixels around. That is not considered the texture’s state.

    Allow me to repeat: these are the only functions that modify texture state. glTexEnv modifies environment state; it doesn’t affect anything stored in texture objects.

    Active Texture

    The situation for textures is more complex, again for legacy reasons best left undisclosed. This is where glActiveTexture comes in.

    For textures, there aren’t just targets (GL_TEXTURE_1D, GL_TEXTURE_CUBE_MAP, etc). There are also texture units. In terms of our C/C++ example, what we have is this:

    Object *g_objs[MAX_OBJECTS][MAX_LOCATIONS] = {NULL};
    int g_currObject = 0;
    
    void BindObject(int loc, Object *obj)
    {
      g_objs[g_currObject][loc] = obj;
    }
    
    void ActiveObject(int currObject)
    {
      g_currObject = currObject;
    }
    

    Notice that now, we not only have a 2D list of Objects, but we also have the concept of a current object. We have a function to set the current object, we have the concept of a maximum number of current objects, and all of our object manipulation functions are adjusted to select from the current object.

    When you change the currently active object, you change the entire set of target locations. So you can bind something that goes into current object 0, switch to current object 4, and will be modifying a completely different object.

    This analogy with texture objects is perfect… almost.

    See, glActiveTexture does not take an integer; it takes an enumerator. Which in theory means that it can take anything from GL_TEXTURE0 to GL_TEXTURE31. But there’s one thing you must understand:

    THIS IS FALSE!

    The actual range that glActiveTexture can take is governed by GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS. That is the maximum number of simultaneous multitextures that an implementation allows. These are each divided up into different groupings for different shader stages. For example, on GL 3.x class hardware, you get 16 vertex shader textures, 16 fragment shader textures, and 16 geometry shader textures. Therefore, GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS will be 48.

    But there aren’t 48 enumerators. Which is why glActiveTexture doesn’t really take enumerators. The correct way to call glActiveTexture is as follows:

    glActiveTexture(GL_TEXTURE0 + i);
    

    where i is a number between 0 and GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

    Rendering

    So what does all of this have to do with rendering?

    When using shaders, you set your sampler uniforms to a texture image unit (glUniform1i(samplerLoc, i), where i is the image unit). That represents the number you used with glActiveTexture. The sampler will pick the target based on the sampler type. So a sampler2D will pick from the GL_TEXTURE_2D target. This is one reason why samplers have different types.

    Now this sounds suspiciously like you can have two GLSL samplers, with different types that use the same texture image unit. But you can’t; OpenGL forbids this and will give you an error when you attempt to render.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

From what I gather, Google Chrome can run browser plugins written using NPAPI .
How can our team gather requirements from our Product Owner in as low friction
From what I can gather, there are three categories: Never use GET and use
I keep hearing from associates about grid computing which, from what I can gather,
I have used .NET 3.5 with C# to create functions to gather data from
I have created a DLL that will gather information from the AssemblyInfo.cs. In the
I have two tables that I need to gather data from, then add up
I have to gather information from a product page which does not have any
I'm working on a project where I have to gather data from GPS devices
I want to gather data from different data servers located in Europe and Asia.

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.