I’m trying to get a cube map working for my environment around a teapot. The image only comes up as the teapot, correctly lit, with no background, just white space. Help?
Here’s my code for init() and display():
static GLuint texname;
GLubyte* env;
void init(void)
{
int width;
int height;
env = readPPM("uffizi_cross.ppm",&width,&height);
glClearColor(0.3,0.3,0.3,1.0);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, &texname);
glBindTexture(GL_TEXTURE_CUBE_MAP, texname);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, env);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, env);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, env);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, env);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, env);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, env);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
GLfloat lpos[] = {0.0,-10.0,-15.0,1.0};
GLfloat La[] = {1.0,1.0,1.0,1.0};
GLfloat Lid[] = {1.0,1.0,1.0,1.0};
GLfloat Lis[] = {1.0,1.0,1.0,1.0};
GLfloat ka[] = {0.005,0.1,0.01,1.0};
GLfloat kd[] = {0.015,0.3,0.03,1.0};
GLfloat ks[] = {0.5,0.5,0.5,1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ka);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, kd);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, ks);
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,50.0);
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
glLightfv(GL_LIGHT0, GL_POSITION, lpos);
glLightfv(GL_LIGHT0, GL_AMBIENT, La);
glLightfv(GL_LIGHT0, GL_DIFFUSE, Lid);
glLightfv(GL_LIGHT0, GL_SPECULAR, Lis);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(-3.f,5.f,5.f,0.f,0.f,0.f,0.f,1.f,0.f);
glEnable(GL_TEXTURE_CUBE_MAP);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_X, texname);
glBegin(GL_QUADS);
glNormal3f(-0.5f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(10.0f, -10.0f, -10.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(10.0f, -10.0f, 10.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(10.0f, 10.0f, 10.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(10.0f, 10.0f, -10.0f);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, texname);
glBegin(GL_QUADS);
glNormal3f( 0.5f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-10.0f, -10.0f, 10.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-10.0f, -10.0f, -10.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-10.0f, 10.0f, -10.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-10.0f, 10.0f, 10.0f);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, texname);
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.5f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 10.0f, 10.0f, 10.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-10.0f, 10.0f, 10.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-10.0f, 10.0f, -10.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 10.0f, 10.0f, -10.0f);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, texname);
glBegin(GL_QUADS);
glNormal3f( 0.0f, -0.5f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 10.0f, -10.0f, -10.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-10.0f, -10.0f, -10.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-10.0f, -10.0f, 10.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 10.0f, -10.0f, 10.0f);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, texname);
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, -0.5f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 10.0f, -10.0f, 10.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-10.0f, -10.0f, 10.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-10.0f, 10.0f, 10.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 10.0f, 10.0f, 10.0f);
glEnd();
glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, texname);
glBegin(GL_QUADS);
glNormal3f( 0.0f, 0.0f, 0.5f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-10.0f, -10.0f, -10.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 10.0f, -10.0f, -10.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 10.0f, 10.0f, -10.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-10.0f, 10.0f, -10.0f);
glEnd();
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glutSolidTeapot(1.3);
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_CUBE_MAP);
glutSwapBuffers();
}
readPPM reads the .ppm file and stores the data as a char array of rgb data and stores the height and width of the image in the height and width parameters. Please help me fix this…