   3D Textures
  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   
  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()   ;Quote:Original post by rouncEDYeh 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 rouncEDTheres 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.   ;  Here's a rather cool paper about generating 3D (solid) textures from 2D examples:Solid Texture Synthesis from 2D ExemplarsUnfortunatly 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...   ;Quote:Original post by GeometrianI'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.   ;  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   ;  I should have pointed out that he does have some example textures for download here: http://johanneskopf.de/publications/solid/textures/index.htmlHowever, 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.   ;  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];  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...   ;  Translation thread here:http://www.gamedev.net/community/forums/topic.asp?topic_id=538657Getting back to the main topic, is there some standard for storing volumetric textures?  As I understand it, they're mostly procedural, but not every 3D texture I've seen is that way.It would be cool to make sense of that article sometime :D   