Hi! The program I wrote, should read the values of a volume ( the array “volumevalues” is an example of 1x1x3 volume) map it into 3 poligons, blend them, and put the result in an array. It should simulate a radiography…
I have a problem, the program compiles, and runs… but the result is:
Data before roundtrip:
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
Data after roundtrip:
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
0,000000
Instead it should be the result of the volume values blended!Anyone has an idea? Please help!!
#include <cstdio>
#include <cstdlib>
using namespace std;
// --------------------------------------------
// Include
#include <gl\glew.h>
#include <gl\glut.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <windows.h>
//transform alpha from double to char
char DoubleToChar(double alpha){
return (char)(alpha*255,0);
}
int main(int argc, char **argv) {
//volume values: the volume contains 3 values along z
unsigned char volumevalues[12]={1,0,0,1,1,0,0,0,1,0,0,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 sumulation”);
glewInit();
// create the texture
GLuint tex;
glGenTextures (1, &tex);
glBindTexture(GL_TEXTURE_3D,tex);
// sets the texture parameter
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);
/void glTexImage3D (GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,const GLvoid * pixels)/
// allocates graphic memory
glTexImage3D(GL_TEXTURE_3D,0,GL_RGBA,1,1,3,0,GL_RGBA,GL_UNSIGNED_BYTE, volumevalues);
/* void gluOrtho2D(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top); The clipping region is a rectangle with the lower-left corner at (left, bottom) and the upper-right corner at (right, top).
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height); Defines a pixel rectangle in the window into which the final image is mapped. The (x, y) parameter specifies the lower-left corner of the
viewport, and width and height are the size of the viewport rectangle.*/
//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);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glEnable(GL_TEXTURE_3D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
float z= ((float)1)/3;
float y =((float)1)/3;
glBegin(GL_QUADS);
glTexCoord3f(0.0,0.0,0.0); glVertex2f(0,0);
glTexCoord3f(0.0,1.0,0.0); glVertex2f(0,1);
glTexCoord3f(1.0,1.0,0.0); glVertex2f(1,1);
glTexCoord3f(1.0,0.0,0.0); glVertex2f(1,0);
glTexCoord3f(0.0,0.0,z); glVertex2f(0,0);
glTexCoord3f(0.0,1.0,z); glVertex2f(0,1);
glTexCoord3f(1.0,1.0,z); glVertex2f(1,1);
glTexCoord3f(1.0,0.0,z); glVertex2f(1,0);
glTexCoord3f(0.0,0.0,y); glVertex2f(0,0);
glTexCoord3f(0.0,1.0,y); glVertex2f(0,1);
glTexCoord3f(1.0,1.0,y); glVertex2f(1,1);
glTexCoord3f(1.0,0.0,y); glVertex2f(1,0);
glEnd();
glPopMatrix();
/void glReadBuffer(GLenum mode): specifies a color buffer as the source for subsequent read and copy image commands/
/*void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid pixels);/
//reads datas from the frame buffer and put them into array “result”
glReadBuffer(GL_FRONT);
glReadPixels(0,0,1,1,GL_RGBA,GL_BYTE,result);
// print out results
printf("Data before roundtrip:
“);
for (int i=0; i<12; i++)
printf(”%f
", volumevalues [i]);
printf("Data after roundtrip:
“);
for (int i=0; i<12; i++)
printf(”%f
",result[i]);
getchar();
return 0;
}