#include <cstdio>
#include <cstdlib>
using namespace std;
#include <gl\glew.h>
#include <gl\glut.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <windows.h>
//trasforms alpha from double to char and from 0 and 255
char DoubleToChar(double alpha){
return (char)(alpha*255.0);
}
int main(int argc, char **argv) {
//Volume values: it represents a 1x1x3 volume ( 3 slices along z)
unsigned char Volumevalues[12]={1,0,0,1,2,0,0,0,3,0,0,0};
Volumevalues [3]=DoubleToChar(1.0);
Volumevalues [7]=DoubleToChar(1.0/2.0);
Volumevalues [11]=DoubleToChar(1.0/3.0);
unsigned char result [12]; //array for the result
//initialize glut
glutInit (&argc, argv);
glutCreateWindow("radiographic simulation");
glewInit();
// create the texture
GLuint tex;
glGenTextures (1, &tex);
glBindTexture(GL_TEXTURE_3D,tex);
// sets texture’s parameters
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
//allocate the texture
glTexImage3D(GL_TEXTURE_3D,0,GL_RGBA,1,1,4,0,GL_RGBA,GL_UNSIGNED_BYTE, Volumevalues);
//viewport transform for 1:1 pixel=texel=data mapping
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,1,0.0,1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0,0,1,1);
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
glBlendColor(1.0/3,1.0/3,1.0/3,1.0/3);
glBlendEquation(GL_CONSTANT_COLOR);
glEnable(GL_BLEND);
glPushMatrix();
glEnable(GL_TEXTURE_3D);
float a= ((float)0.5)/3.0;
float b =((float)1.5)/3.0;
float c= ((float)2.5)/3.0;
glBegin(GL_QUADS);
glTexCoord3f(0.0,0.0,a); glVertex2f(0,0);
glTexCoord3f(0.0,1.0,a); glVertex2f(0,1);
glTexCoord3f(1.0,1.0,a); glVertex2f(1,1);
glTexCoord3f(1.0,0.0,a); glVertex2f(1,0);
glTexCoord3f(0.0,0.0,b); glVertex2f(0,0);
glTexCoord3f(0.0,1.0,b); glVertex2f(0,1);
glTexCoord3f(1.0,1.0,b); glVertex2f(1,1);
glTexCoord3f(1.0,0.0,b); glVertex2f(1,0);
glTexCoord3f(0.0,0.0,c); glVertex2f(0,0);
glTexCoord3f(0.0,1.0,c); glVertex2f(0,1);
glTexCoord3f(1.0,1.0,c); glVertex2f(1,1);
glTexCoord3f(1.0,0.0,c); glVertex2f(1,0);
glEnd();
glPopMatrix();
//reads datas from the frame buffer and write them into the array result
glReadBuffer(GL_FRONT);
glReadPixels(0,0,1,1,GL_RGBA,GL_BYTE,result);
// print out results
printf("Data before roundtrip:\n");
for (int i=0; i<16; i++)
printf("%d\n", Volumevalues [i]);
printf("Data after roundtrip:\n");
for (int i=0; i<4; i++)
printf("%d\n",result[i]);
getchar();
return 0;
}