Sign in to follow this  

Water Reflection and Opacity

This topic is 2183 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello again!

I'm having trouble with water opacity and reflection at the same time...

I can do them apart but not at the same time.

[CODE]
GLvoid DrawGLScene(GLvoid){
float look[3] = {0.0,0.0,0.0};

double eqr[] = {0.0f,0.0f, -1.0f, 0.0f}; // Plane Equation To Use For The Reflected Objects
glClearColor(0.0f,0.0f,0.0f,1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glLoadIdentity();
add_vector(default_player->dir,look);
add_vector(default_player->cam,look);
gluLookAt(default_player->cam[0], default_player->cam[1], default_player->cam[2], look[0], look[1], look[2], 0, 0, 1);

glEnable(GL_STENCIL_TEST);
glColorMask(0,0,0,0);
glDisable(GL_DEPTH_TEST);
glStencilFunc(GL_ALWAYS, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);

RenderWater();

glColorMask(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
/* DRAW */

glEnable(GL_CLIP_PLANE0);
glClipPlane(GL_CLIP_PLANE0, eqr);
glPushMatrix();
glScalef(1.0f, 1.0f, -1.0f);
glLightfv(GL_LIGHT1, GL_POSITION,default_player->light_pos);
gl_all_textures(hash_tex, default_player,map,1); /* terrain */
glPopMatrix();
glDisable(GL_CLIP_PLANE0);
glDisable(GL_STENCIL_TEST);
glLightfv(GL_LIGHT1, GL_POSITION,default_player->light_pos);

RenderSky();
RenderText();

RenderWater(); /* reflection working but no opactity */
gl_all_textures(hash_tex, default_player,map,0); /* terrain */
// RenderWater(); /* opacity working but no reflection */

glutSwapBuffers();
}
[/CODE]

[img]http://img545.imageshack.us/img545/6306/capturadeecr26012012041.png[/img]

my goal is something like this:
[img]http://www.golf-simulators.com/images/pondbed.jpg[/img]

Share this post


Link to post
Share on other sites
Well, I'm not sure if this will work or not, but assuming that you're using alpha values for the Water (or maybe you need alpha values for the reflection?), you should be enabling blending. Usually you use it like so, you can however use it many different ways though:

[code]
glEnable(GL_BLEND); // Enables blending for OpenGL


glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Set the Blending function
[/code]

There's a lot more OpenGL blending functions, but this might do the job, ask Google if you don't like it. [img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img]

FAQ on Transperancy:
[url="http://www.opengl.org/resources/faq/technical/transparency.htm"]http://www.opengl.or...ransparency.htm[/url]

Sorry if you already know this, it just doesn't seem like your enabling blending o:

Share this post


Link to post
Share on other sites
[CODE]
void RenderWater(){
static float wx=0, wy=0;

glBindTexture(GL_TEXTURE_2D, 5);
glColor4f(0.3, 0.3, 0.3, 0.6);
glEnable(GL_BLEND);
glDisable(GL_LIGHTING);
if(default_player->lines==0){
glBegin(GL_QUADS);
glTexCoord2f(-map->size+wx, -map->size+wy); glVertex3f (-map->size*0.5,-map->size*0.5,0.0);
glTexCoord2f(+map->size+wx, -map->size+wy); glVertex3f (map->size*0.5,-map->size*0.5,0.0);
glTexCoord2f(+map->size+wx, +map->size+wy); glVertex3f (map->size*0.5,map->size*0.5,0.0);
glTexCoord2f(-map->size+wx, +map->size+wy); glVertex3f (-map->size*0.5,map->size*0.5,0.0);
map->water_level+=0.002;
if(map->water_level>2*PI)
map->water_level-=2*PI;
glEnd();
wx+=0.002;
wy+=0.002;
if(wx>8) wx-=8;
if(wy>8) wy-=8;
}
glDisable(GL_BLEND);
glDisable(GL_LIGHTING);
}
[/CODE]

I enabled blend in RenderWater().

Share this post


Link to post
Share on other sites
The technique that you're using (where you use the stencil buffer to render the regular scene and the "mirrored" scene into the same render-target) is pretty old school.
To achieve robust transparency, I would recommend rendering the "mirrored" scene into a separate render-target, and then compositing the result on top of the regular scene.

Share this post


Link to post
Share on other sites
I found the following resource particularly useful, but you would have to convert to OpenGL and use shaders:

[url="http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series4/The_water_technique.php"]http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series4/The_water_technique.php[/url]

The explanation is pretty good though :)

Share this post


Link to post
Share on other sites
Sign in to follow this