hi! i have a problem… i tryed to implement a volume’s slices blending using 3d texture. i can compile without problems, but when I run it, i have: exception not managed to 0x00000000 in volume.exe: 0xC0000005: Access Violation in reading path 0x00000000. please HELP!!
#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>
//trasform alpha from double to char and from 0 to 255
char DoubleToChar(double alpha){
return (char)(alpha*255,0);
}
int main(int argc, char **argv) {
//values of the volume: it’s a volume of 3 blocks long z
char valuesVolume[12]={1,0,0,1,1,0,0,0,1,0,0,0};
valuesVolume[7]=DoubleToChar(1.0/2.0); //write the correct alphas
valuesVolume[11]=DoubleToChar(1.0/3.0);
char result[12]; //array for the result
// initialize glut
glutInit (&argc, argv);
glutCreateWindow(“volume”);
glewInit();
// create the texture
GLuint tex;
glGenTextures (1, &tex);
glBindTexture(GL_TEXTURE_3D,tex);
// texture 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);
/void glTexImage3D (GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLsizei depth,GLint border,GLenum format,GLenum type,const GLvoid * pixels)/
// allocate graphic memory
glTexImage3D(GL_TEXTURE_3D,0,GL_RGBA, 1,1,3,0,GL_RGBA,GL_BYTE,valuesVolume);
/* 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 frame buffer and write them in “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
",valuesVolume[i]);
printf("Data after roundtrip:
“);
for (int i=0; i<12; i++)
printf(”%f
",result[i]);
getchar();
return 0;
}