Skip to main content
gamedev.net
🔒 Locked

Cube mapping problem

Started by Gammastrahler 1 reply 650+ views
Original Post
Gammastrahler
Gammastrahler
Hi, i have problems with cube mapping. OK, i have built a simple OpenGL app that uses each side of a prerendered skybox as the cubemap textures, then i draw a simple rectangular window, and the reflections are shown. but what i dont understand is why some other demos manipulate the texture matrix to "perspective correct" it? what does that mean? in my sample, if look around, the reflection changes, but it should only change when i move. how can i do this? im totally confused!! what does OpenGL for me and what do i have to do on my own? What is considered "correct cube mapping" to do reflections? I have read the nvidia paper but i´m still confused I would be glad if anyone could help me a bit thanks Gammastrahler
Yann L
Yann L
Hmm, how are you generating the texcoords ? Or are you using an automatic texgen with NORMAL_MAP(_ARB) or REFLECTION_MAP(_ARB) ?

A cube environment map is simply a lookup table for incident light around a point. Any application of such a map onto an non-dimensionless object, is already an approximation, so there isn''t really a physically correct way to do environment mapping.

But if you''d like to simulate reflections, then the intended way to use an env-cubemap is to compute the true reflection vector at each vertex. You then use that as an index vector into the cubemap. Unless you want perpixel reflections, then you need those reflection vectors per-pixel (in combination with a bumpmap). This later effect is also known as EMBM.
Gammastrahler
Gammastrahler
Hi,

i use GL_REFLECTION_MAP_ARB,

the problem is, i have now a cube rendered, if i walk around, then the reflections seem to be ok, but if my camera stands on a straight line to each cube´s face, they show the same reflected env map side (the front side).

additionally, the map is turned about a degree of 180.

here is some source code:


  
// Load each of the cube map´s sides

void LoadCubemap()
{
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, gskytex[0]->data);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, gskytex[1]->data);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, gskytex[2]->data);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, gskytex[3]->data);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, gskytex[4]->data);
glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, gskytex[5]->data);
}

// Draw an environment mapped cube (only 4 sides)

void DrawMyCube()
{
glActiveTextureARB(GL_TEXTURE0_ARB);

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
glEnable(GL_TEXTURE_CUBE_MAP_EXT);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);

glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, shinyTex->texID);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_ARB, 4);

glNormal3f(0.0, 0.0, 1.0);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f); glVertex3f(-2.5f, -2.5f, 2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f); glVertex3f(2.5f, -2.5f, 2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f); glVertex3f(2.5f, 2.5f, 2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f); glVertex3f(-2.5f, 2.5f, 2.5f);
glEnd();

glNormal3f(0.0, 0.0, -1.0);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f); glVertex3f(2.5f, -2.5f, -2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f); glVertex3f(-2.5f, -2.5f, -2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f); glVertex3f(-2.5f, 2.5f, -2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f); glVertex3f(2.5f, 2.5f, -2.5f);
glEnd();

glNormal3f(-1.0, 0.0, 0.0);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f); glVertex3f(-2.5f, -2.5f, -2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f); glVertex3f(-2.5f, -2.5f, 2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f); glVertex3f(-2.5f, 2.5f, 2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f); glVertex3f(-2.5f, 2.5f, -2.5f);
glEnd();

glNormal3f(1.0, 0.0, 0.0);
glBegin(GL_QUADS);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f); glVertex3f(2.5f, -2.5f, 2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f); glVertex3f(2.5f, -2.5f, -2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f); glVertex3f(2.5f, 2.5f, -2.5f);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f); glVertex3f(2.5f, 2.5f, 2.5f);
glEnd();

glActiveTextureARB(GL_TEXTURE1_ARB);
glDisable(GL_TEXTURE_2D);

glActiveTextureARB(GL_TEXTURE0_ARB);
glDisable(GL_TEXTURE_CUBE_MAP_EXT);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
}


Hopefully someone can see what´s wrong with it.

thanks
Gammastrahler

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.