OpenGL texture managing help needed

Started by
3 comments, last by mmakrzem 17 years, 6 months ago
I'm trying to figure out how to create a texture manager in OpenGL. Previously I worked with DirectX and what I did there was the following: I created n number of containers that could t number of triangles of a specific type. ie a type would be defined by the material, texture etc used. everytime I render an object, it would be subdivided up into the appropriate container(s). when a container became full then I would empty it by rendering all items in the container to the screen. if at any point I needed more then n containers since a unique triangle was requested to be rendered then I would look through the n current containers and find the container that has the most amount of triangles in it. I would then render all items in that container and use it to hold the new triangle type. Now I was thinking of implementing the same sort of thing in OpenGL but I don't think I can because of the way that OpenGL works in comparison to DirectX. So my question is, how can I organize my data that I want to render, so that I minimize the number of texture loading/binding calls that are required to be done during each frame rendered. As an example, say that I have 3 objects made of of textures A, B, and C. What I would like to do is bind texture A, render each of the pieces of all the objects that contain texture A. Then bind texture B and render all the pieces in the scene that use texture B. Repeat for texture C. This way I am not switching multiple times between textures in one render call. Also in OpenGL, is there anyway to know how many textures I can stuff into the video memory at one time? For example in the previous case, if I can put textures A B and C all into the video memory at the same time, then it shouldn't matter how many times I bind to each one since the data doesn't have to transfer over to the graphics card each time.
Advertisement
Nope, there is no way to know, once you upload the data to opengl (via the glTexImage() function) what happens to it is driver dependant.

It will probably endup in VRAM at "somepoint" however the swapping in and out operations are handled by the driver (I believe they use a Least-recently-used scheme to decide what stays in VRAM and what doesn't when space is needed) as is the "somepoint", it could be on first bind after the glTexImage call, it could be right after it, no one knows...

The scheme you outlined above however will work just as well with OGL as it did with DX, batching is still very much the order of the day.

To be honest, I'm not sure what 'differences' you are coming across between how OGL and D3D handle texture uploads...
Could you show me some pseudo code (or real code would be even better), on how I can batch render calls in OpenGL.
Quote:Original post by mmakrzem
Could you show me some pseudo code (or real code would be even better), on how I can batch render calls in OpenGL.


Not sure, but I am assuming he means use one texture call glBindTexture() and draw all polygons that use that texture with each object glDraw*(). And then move onto the next object and repeat as needed... That's my best guess.
That's exactly what I am trying to achieve however I don't know how to structure my code so that I can "find" all polygons that use a specific texture/material. I don't want to search through all my scene objects for each texture/material since this will kill performance.

This topic is closed to new replies.

Advertisement