Jump to content
  • Advertisement
Sign in to follow this  
Geometrian

OpenGL 3D Textures

This topic is 3315 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I recently got 3D textures working in my OpenGL application. It would be nice to have some 3D textures to work with, though. Presently, I'm just taking a 2D image and using it (depth=1), but I know greater things are possible. On a slight tangent, how are 3D textures stored? I had the idea to use a 2D image. Suppose you have a 512x512 image, that can hold the data for a 64x64x64 texture. Is this the way 3D textures are typically stored? I'm hoping for a metallic 3D texture, as that fits nicely into my new game, but really any sort of 3D texture would be good right now. Any decent free resources? I couldn't find any... Thanks, Ian

Share this post


Link to post
Share on other sites
Advertisement
Yeh 3d textures are amazing, they are just a bunch of 2d textures on top of each other.

Did you know, you can actually create a high detail 3d voxel surface on top of your triangle models, and you can render any kind of advanced 3d voxel pattern.

And you can probably draw 10 flat sprites on top of each other and you could make things like grass on the surface of a landscape.

Its just a matter of making the grass model in 3dsmax, convert it to 3d textures, then displaying in game, 256 flats ontop of each other restoring the grass in 3d.

Theres almost no difference in just storing 10 normal textures as aposed to loading a single 3d texture with 10 layers... its just you get special 3d retrieves from a 3d texture, when you Tex2DLod()

Share this post


Link to post
Share on other sites
Quote:
Original post by rouncED
Yeh 3d textures are amazing, they are just a bunch of 2d textures on top of each other.

They're a bit more than that. Texture arrays are essentially just 'a bunch of 2D textures', but even they have some very significant differences.

Quote:
Original post by rouncED
Theres almost no difference in just storing 10 normal textures as aposed to loading a single 3d texture with 10 layers...

There are a lot of differences. First off, a 3D texture allows quad-linear interpolation, instead of the trilinear 2D texture interpolation. The hardware will also interpolate on the depth axis. Second, mipmap sizes are defined by a cubic function, instead of a quadratic one. Third, a 3D texture is a monolithic structure, from the point of view of the GPU. It cannot be partially swapped out of VRAM, even if you only use a small subset of it. This is very different from a set of 2D textures, which can be partially swapped. And last, most importantly, you can sample a 3D texture by using a single texture lookup with a three component vector. This is totally impossible with a bunch of 2D texture, where each texture requires a separate image unit, a separate lookup and complicated logical to actually select the right images and interpolants.

Quote:

On a slight tangent, how are 3D textures stored? I had the idea to use a 2D image. Suppose you have a 512x512 image, that can hold the data for a 64x64x64 texture. Is this the way 3D textures are typically stored?

Depends on the GPU architecture. Most GPUs don't even store 2D textures in the straightforward way, due to texture cache issues. From the host application point of view, 3D textures are stored per slice.

3D textures are very useful, but don't get too excited about using them everywhere. They take up a lot of memory. A simple RGBA 512³ texture will eat up 512 MB VRAM ! In fact, the best usage scenarios for 3D textures involve very asymmetric texture sizes, for example 512*512*4. They're used to store more information per pixel then a typical RGBA texture can provide (16 components instead of the usual 4, in this example). This can be used to store spherical harmonic coefficients in a lightmap, for example.

Share this post


Link to post
Share on other sites
Here's a rather cool paper about generating 3D (solid) textures from 2D examples:

Solid Texture Synthesis from 2D Exemplars

Unfortunatly I've asked the author for source code/executable but haven't got anywhere.

One advantage of 3D textures is that you don't need to specify UV texture coordinates for you models. Instead, you can just use the vertex positions as texture coordinates (possibly scaled, rotated, etc). This makes then useful for texturing proceduraly generated geometry, or geometry which changes dynamically.

Disadvantages include the memory required, and the fact that they are hard to generate. You could generate them procedurally, but you might also want to look at exporting them from 3D modelling packages. Such packages typically have a 3D material editor. If you rendered this material onto a bunch of adjacent slices you could take the resultig images and rebuild the 3D texture. Scripting could make this automatic...

Share this post


Link to post
Share on other sites
Quote:
Original post by Geometrian
I'm hoping for a metallic 3D texture, as that fits nicely into my new game, but really any sort of 3D texture would be good right now. Any decent free resources? I couldn't find any...

3D-textures consist from layers,but has more specific mipmaping-in their mipmaps neighbouring layers are also mixed.And the sampling time from 3D-textures takes more time than usual. One of their advantages is possibility of sampling "between" layers,but if you will try to interpolate 1st and 3rd layers for example,you can't skip 2nd. And so on.

Share this post


Link to post
Share on other sites
I'm thinking something small (like 643) will be entirely sufficient for my purposes. That amount of data should be about as much as a single 5122 texture.

I think the point about using it for extra color channels is awesome.

Likewise, PolyVox, that link is great! Something like that is perfect--but I need something to work from; that paper is pretty impassible...

-G

Share this post


Link to post
Share on other sites
I should have pointed out that he does have some example textures for download here: http://johanneskopf.de/publications/solid/textures/index.html

However, you will need to decode the file format (doubt if it's complex). But after some examination I noticed that the textures lack high frequency detail - that is, they look blurred compared to the 2D examples. Guess the algorithm needs more work but it's still pretty impressive.

Share this post


Link to post
Share on other sites
I thought those were 2D textures, so I missed them...

Alright, so decoding the file system. They give this spec on the matter. I'm trying to translate this to Python. Any clues--or would this be better in the Scripting Languages forum...? (I'm working with "corral.vol" which I presume is a misspelling of "coral"...)

So far, I've got:
file = open("coral.vol", "r")
header = file.read(4096)
The header data is apparently turned into a struct (class) VolumeHeader. The rest of the file is then read. Should be simple enough to convert--if I were more familiar with C languages...

-G

[Edited by - Geometrian on June 20, 2009 6:30:37 PM]

Share this post


Link to post
Share on other sites
I'm not familiar with Python, but I agree it should be simple to convert. It looks like a pretty basic format - no compression etc. But yes, a Python forum might be able to help more...

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!