How do you write a header for a 128x128x128 dds volume texture file with no mipmaps and does it have to be written in binary?

Answer:

Answer

According to the documentation on MSDN, the following code should create an uncompressed volume texture DDS file that's 32x32x32 in size. Re-scale as you see fit. Note: a 128x128x128 RGBA texture will take up 8 MB of VRAM!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>


#define DDSD_CAPS	0x00000001
#define DDSD_HEIGHT	0x00000002
#define DDSD_WIDTH	0x00000004
#define DDSD_PITCH	0x00000008
#define DDSD_PIXELFORMAT	0x00001000
#define DDSD_MIPMAPCOUNT	0x00020000
#define DDSD_LINEARSIZE	0x00080000
#define DDSD_DEPTH	0x00800000

#define DDPF_ALPHAPIXELS	0x00000001
#define DDPF_FOURCC	0x00000004
#define DDPF_RGB	0x00000040

#define DDSCAPS_COMPLEX	0x00000008
#define DDSCAPS_TEXTURE	0x00001000
#define DDSCAPS_MIPMAP	0x00400000

#define DDSCAPS2_CUBEMAP	0x00000200
#define DDSCAPS2_CUBEMAP_POSITIVEX	0x00000400
#define DDSCAPS2_CUBEMAP_NEGATIVEX	0x00000800
#define DDSCAPS2_CUBEMAP_POSITIVEY	0x00001000
#define DDSCAPS2_CUBEMAP_NEGATIVEY	0x00002000
#define DDSCAPS2_CUBEMAP_POSITIVEZ	0x00004000
#define DDSCAPS2_CUBEMAP_NEGATIVEZ	0x00008000
#define DDSCAPS2_VOLUME	0x00200000


int depth = 32;
int width = 32;
int height = 32;

unsigned int header[32];

int main( int argc, char * argv[] ) {
  if( !argv[1] || !strstr( argv[1], ".dds" ) ) {
    fprintf( stderr, "Usage: noise output.dds\n" );
    return 1;
  }
  unsigned int cnt = width*height*depth*4;
  unsigned char * buf = new unsigned char[ cnt ];
  while( cnt-- ) {
    buf[cnt] = rand()>>7;
  }
  memset( header, 0, sizeof( header ) );
  header[0] = ' SDD';
  header[1] = 124;
  header[2] = DDSD_CAPS | DDSD_PIXELFORMAT | DDSD_WIDTH | DDSD_HEIGHT | DDSD_DEPTH | DDSD_PITCH;
  header[3] = height;
  header[4] = width;
  header[5] = width*4;
  header[6] = depth;
  header[19] = 32;
  header[20] = DDPF_RGB|DDPF_ALPHAPIXELS;
  header[22] = 8;
  header[23] = 0xff0000;
  header[24] = 0xff00;
  header[25] = 0xff;
  header[26] = 0xff000000;
  header[27] = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX;
  header[28] = DDSCAPS2_VOLUME;
  FILE * f = fopen( argv[1], "wb" );
  if( !f ) {
    fprintf( stderr, "can't create: %s\n", argv[1] );
    return 1;
  }
  fwrite( header, 4, 32, f );
  fwrite( buf, 1, width*height*depth, f );
  fclose( f );
  fprintf( stderr, "wrote %s\n", argv[1] );
  return 0;
}
First answer by ID1158753672. Last edit by ID1158753672. Question popularity: 96 [recommend question].