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
#defin e DDSD_MIPMAPCOUNT 0x00020000
#defin e DDSD_LINEARSIZE 0x00080000
#define DDSD_DEPTH 0x00800000
#define DDPF_ALPHAPIXELS 0x00000001
#defin e DDPF_FOURCC 0x00000004
#define DDPF_RGB 0x00000040
#define DDSCAPS_COMPLEX 0x00000008
#define DDSCAPS_TEXTURE 0x00001000
#define DDSCAPS_MIPMAP 0x00400000
#defin e DDSCAPS2_CUBEMAP 0x00000200
#defin e DDSCAPS2_CUBEMAP_POSITIVEX 0x000004 00
#define DDSCAPS2_CUBEMAP_NEGATIVEX 0x000008 00
#define DDSCAPS2_CUBEMAP_POSITIVEY 0x000010 00
#define DDSCAPS2_CUBEMAP_NEGATIVEY 0x000020 00
#define DDSCAPS2_CUBEMAP_POSITIVEZ 0x000040 00
#define DDSCAPS2_CUBEMAP_NEGATIVEZ 0x000080 00
#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;
Answered by
Nz
, an ibibo Master,
at
2:15 AM on January 13, 2008