PDA

View Full Version : projected texture problem



hazelwood
01-19-2006, 12:12 AM
I try to project a texture onto a flat surface (water relection for terrain)
I am using glCopyTexSubImage2D and the generated 512x512 sized texture looks just like it should.

Then I render the scene in 800x600 but when I map the texture onto the water surface then it is not correctly projected along the x axis. The part that is correct is centered on the x axis and is excactly 600 pixels wide (which happens to be the Height of my viewport). On both sides of the view the texture warps in from the other end but I don't know why? The projection should be 800 wide not 600. On the y axis there is no such problem; I guess that's because it's using 800 as height so I never see a texture warping on y axis. For some reason there is width and height inverted, but how did that happen? I double checked all my glViewport calls in case I mistyped width for height or something.

Here is how I do the projection matrix:


glBindTexture(watertex->id);

// setup projection matrix
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
// center texture
glTranslatef(0.5f,0.5f,0.0f);
glScalef(0.5f,0.5f,1.0f);

// setup an isometric camera (the same camera setup is used when rendering the texture)
float fov = 16.0f;
float ratio = watertex->width / watertex->height;
float v = camera->znear * tanf ((fov/2.0f) * PI_OVER_180);
float u = v * ratio;
glFrustum(-u, u, -v, v, camera->znear, camera->zfar);
glTranslatef(0.0f,0.0f,camera->zoom);
glRotatef(camera->yaw, 1.0f,0.0f,0.0f);
glTranslatef(camera->pos.x, camera->pos.y, camera->pos.z);
glRotatef(camera->pitch, 0.0f,1.0f,0.0f);
glScalef(1.0f,-1.0f,1.0f); // turn upside down

glMatrixMode(GL_MODELVIEW);

// render a quad with water texture
glBegin(GL_QUADS);
glTexCoord3f(0.0f, SEA_LEVEL, 0.0f); glVertex3f(0.0f, SEA_LEVEL, 0.0f);
glTexCoord3f(64.0f, SEA_LEVEL, 0.0f); glVertex3f(64.0f, SEA_LEVEL, 0.0f);
glTexCoord3f(64.0f, SEA_LEVEL, 64.0f); glVertex3f(64.0f, SEA_LEVEL, 64.0f);
glTexCoord3f(0.0f, SEA_LEVEL, 64.0f); glVertex3f(0.0f, SEA_LEVEL, 64.0f);
glEnd();

// clear projection matrix
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);

hazelwood
01-19-2006, 12:20 AM
here is a screenshot with the texture warping:

http://img4.imageshack.us/img4/8566/projectionbug7fe.th.jpg (http://img4.imageshack.us/my.php?image=projectionbug7fe.jpg)