#include #include #include #include #include #include #include #include #include #include #include #include #include #include static int xRes=32, yRes=32; int main(int argc, char **argv) { Imf::Header exrHeader(xRes, yRes); exrHeader.setType(Imf::DEEPSCANLINE); exrHeader.insert("compression", Imf::CompressionAttribute(Imf::NO_COMPRESSION)); Imf::DeepFrameBuffer exrFrameBuffer; Imf::Array2D sampleCount; sampleCount.resizeErase(yRes, xRes); Imf::Array2D zdata; zdata.resizeErase(yRes, xRes); Imf::Array2D odata; odata.resizeErase(yRes, xRes); exrFrameBuffer.insertSampleCountSlice( Imf::Slice(Imf::UINT, (char*)(&sampleCount[0][0]), sizeof(unsigned int), sizeof(unsigned int) * xRes) ); exrHeader.channels().insert("Z", Imf::Channel(Imf::FLOAT)); exrHeader.channels().insert("O", Imf::Channel(Imf::HALF)); Imf::DeepScanLineOutputFile exrFile(argv[1], exrHeader); exrFrameBuffer.insert( "Z", Imf::DeepSlice(Imf::FLOAT, (char*)(&zdata[0][0]), sizeof(float*), sizeof(float*) * xRes, sizeof(float)) ); exrFrameBuffer.insert( "O", Imf::DeepSlice(Imf::HALF, (char*)(&odata[0][0]), sizeof(half*), sizeof(half*) * xRes, sizeof(half)) ); exrFile.setFrameBuffer(exrFrameBuffer); int sampleSize = 2; for (int y=0; y < yRes; y++) { for (int x=0; x < xRes; x++) { sampleCount[y][x] = sampleSize; zdata[y][x] = new float[sampleSize]; odata[y][x] = new half[sampleSize]; zdata[y][x][0] = -1.0f + ((x / xRes)*2.0f); zdata[y][x][1] = 2.0f - ((y / yRes)*2.0f); odata[y][x][0] = 0.5f; odata[y][x][1] = 1.0f; } exrFile.writePixels(1); } for (int y=0; y < yRes; y++) { for (int x=0; x < xRes; x++) { delete [] zdata[y][x]; } } return 0; }