#version 110
varying vec2 vertex_uv;
uniform sampler2D texture;
uniform sampler2D displace_map;
uniform float maximum;
uniform float time;
void
main (void)
{
float time_e = time * 0.001;
vec2 uv_t = vec2(vertex_uv.s + time_e, vertex_uv.t + time_e);
vec4 displace = texture2D(displace_map, uv_t);
float displace_k = displace.g * maximum;
vec2 uv_displaced = vec2(vertex_uv.x + displace_k,
vertex_uv.y + displace_k);
gl_FragColor = texture2D(texture, uv_displaced);
}
Ripple(
final String image,
final String displace)
throws IOException
{
this.texture_image = Utilities.loadTexture(image);
this.texture_displacement_map = Utilities.loadTexture(displace);
this.framebuffer_texture =
Utilities.createEmptyTexture(
Ripple.TEXTURE_WIDTH,
Ripple.TEXTURE_HEIGHT);
this.framebuffer = Utilities.createFramebuffer(this.framebuffer_texture);
this.shader_uv = Utilities.createShader("dist/shader_uv.v", "dist/shader_uv.f");
this.shader_displace =
Utilities.createShader("dist/shader_uv.v", "dist/shader_displace.f");
}
private void renderToTexture()
{
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 1, 0, 1, 1, 100);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glTranslated(0, 0, -1);
GL11.glViewport(0, 0, Ripple.TEXTURE_WIDTH, Ripple.TEXTURE_HEIGHT);
GL11.glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, this.framebuffer);
{
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.texture_image);
GL13.glActiveTexture(GL13.GL_TEXTURE1);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.texture_displacement_map);
GL20.glUseProgram(this.shader_displace);
{
final int ut = GL20.glGetUniformLocation(this.shader_displace, "texture");
final int udm = GL20.glGetUniformLocation(this.shader_displace, "displace_map");
final int umax = GL20.glGetUniformLocation(this.shader_displace, "maximum");
final int utime = GL20.glGetUniformLocation(this.shader_displace, "time");
GL20.glUniform1i(ut, 0);
GL20.glUniform1i(udm, 1);
GL20.glUniform1f(umax, 0.2f);
GL20.glUniform1f(utime, this.time);
Utilities.checkGL();
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0, 1);
GL11.glVertex3d(0, 1, 0);
GL11.glTexCoord2f(0, 0);
GL11.glVertex3d(0, 0, 0);
GL11.glTexCoord2f(1, 0);
GL11.glVertex3d(1, 0, 0);
GL11.glTexCoord2f(1, 1);
GL11.glVertex3d(1, 1, 0);
}
GL11.glEnd();
}
GL20.glUseProgram(0);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
GL13.glActiveTexture(GL13.GL_TEXTURE1);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
Utilities.checkGL();
}
private void renderScene()
{
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glFrustum(-1, 1, -1, 1, 1, 100);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glTranslated(0, 0, -1.25);
GL11.glRotated(30, 0, 0, 1);
GL11.glViewport(0, 0, Ripple.SCREEN_WIDTH, Ripple.SCREEN_HEIGHT);
GL11.glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL20.glUseProgram(this.shader_uv);
{
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.framebuffer_texture);
Utilities.checkGL();
final int ut = GL20.glGetUniformLocation(this.shader_uv, "texture");
GL20.glUniform1i(ut, 0);
Utilities.checkGL();
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0, 0);
GL11.glVertex3d(-0.75, 0.75, 0);
GL11.glTexCoord2f(0, 1);
GL11.glVertex3d(-0.75, -0.75, 0);
GL11.glTexCoord2f(1, 1);
GL11.glVertex3d(0.75, -0.75, 0);
GL11.glTexCoord2f(1, 0);
GL11.glVertex3d(0.75, 0.75, 0);
}
GL11.glEnd();
}
GL20.glUseProgram(0);
Utilities.checkGL();
}
Caustics(
final String underlay,
final String overlay,
final String displace)
throws IOException
{
this.texture_underlay = Utilities.loadTexture(underlay);
this.texture_overlay = Utilities.loadTexture(overlay);
this.texture_displacement_map = Utilities.loadTexture(displace);
this.framebuffer_texture =
Utilities.createEmptyTexture(
Caustics.TEXTURE_WIDTH,
Caustics.TEXTURE_HEIGHT);
this.framebuffer = Utilities.createFramebuffer(this.framebuffer_texture);
this.shader_uv =
Utilities.createShader("dist/shader_uv.v", "dist/shader_multi_uv.f");
this.shader_displace =
Utilities.createShader("dist/shader_uv.v", "dist/shader_displace.f");
}
private void renderToTexture()
{
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 1, 0, 1, 1, 100);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glTranslated(0, 0, -1);
GL11.glViewport(0, 0, Caustics.TEXTURE_WIDTH, Caustics.TEXTURE_HEIGHT);
GL11.glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, this.framebuffer);
{
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.texture_overlay);
GL13.glActiveTexture(GL13.GL_TEXTURE1);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.texture_displacement_map);
GL20.glUseProgram(this.shader_displace);
{
final int ut =
GL20.glGetUniformLocation(this.shader_displace, "texture");
final int udm =
GL20.glGetUniformLocation(this.shader_displace, "displace_map");
final int umax =
GL20.glGetUniformLocation(this.shader_displace, "maximum");
final int utime =
GL20.glGetUniformLocation(this.shader_displace, "time");
GL20.glUniform1i(ut, 0);
GL20.glUniform1i(udm, 1);
GL20.glUniform1f(umax, 0.1f);
GL20.glUniform1f(utime, this.time);
Utilities.checkGL();
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0, 1);
GL11.glVertex3d(0, 1, 0);
GL11.glTexCoord2f(0, 0);
GL11.glVertex3d(0, 0, 0);
GL11.glTexCoord2f(1, 0);
GL11.glVertex3d(1, 0, 0);
GL11.glTexCoord2f(1, 1);
GL11.glVertex3d(1, 1, 0);
}
GL11.glEnd();
}
GL20.glUseProgram(0);
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
GL13.glActiveTexture(GL13.GL_TEXTURE1);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
}
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
Utilities.checkGL();
}
private void renderScene()
{
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glFrustum(-1, 1, -1, 1, 1, 100);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glTranslated(0, 0, -1.25);
GL11.glRotated(30, 0, 0, 1);
GL11.glViewport(0, 0, Caustics.SCREEN_WIDTH, Caustics.SCREEN_HEIGHT);
GL11.glClearColor(0.25f, 0.25f, 0.25f, 1.0f);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL20.glUseProgram(this.shader_uv);
{
GL13.glActiveTexture(GL13.GL_TEXTURE0);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.texture_underlay);
GL13.glActiveTexture(GL13.GL_TEXTURE1);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.framebuffer_texture);
Utilities.checkGL();
final int ut0 = GL20.glGetUniformLocation(this.shader_uv, "texture0");
GL20.glUniform1i(ut0, 0);
final int ut1 = GL20.glGetUniformLocation(this.shader_uv, "texture1");
GL20.glUniform1i(ut1, 1);
final int um = GL20.glGetUniformLocation(this.shader_uv, "mix");
GL20.glUniform1f(um, 0.5f);
final int us0 = GL20.glGetUniformLocation(this.shader_uv, "scale0");
GL20.glUniform1f(us0, 2.0f);
final int us1 = GL20.glGetUniformLocation(this.shader_uv, "scale1");
GL20.glUniform1f(us1, 0.8f);
Utilities.checkGL();
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0, 0);
GL11.glVertex3d(-0.75, 0.75, 0);
GL11.glTexCoord2f(0, 1);
GL11.glVertex3d(-0.75, -0.75, 0);
GL11.glTexCoord2f(1, 1);
GL11.glVertex3d(0.75, -0.75, 0);
GL11.glTexCoord2f(1, 0);
GL11.glVertex3d(0.75, 0.75, 0);
}
GL11.glEnd();
}
GL20.glUseProgram(0);
Utilities.checkGL();
}