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
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: 89 [recommend question]
|
Research your answer: |
Can you answer other
questions about programming?


