Skip to content

Instantly share code, notes, and snippets.

@fallahn
Last active July 26, 2017 15:53
Show Gist options
  • Save fallahn/8316951 to your computer and use it in GitHub Desktop.
Save fallahn/8316951 to your computer and use it in GitHub Desktop.
2D water effect with GLSL and SFML
const char sinShader[] =
"#version 120\n"
"uniform float time = 1.0;"
"void main(void)"
"{"
"const float sinWidth = 0.08;"
"const float sinHeight = 0.04;"
"const float timeMulti = 10.0;"
"const float val = (sin(gl_FragCoord.x * sinWidth + time * timeMulti) + sin(gl_FragCoord.y * sinHeight + time * timeMulti)) * 0.3 + 0.5;"
"gl_FragColor = vec4(vec3(val), 1.0);"
"}";
const char dudvShader[]=
"#version 130\n"
"uniform sampler2D texture;"
"uniform sampler2D heightmap;"
"const vec2 size = vec2(2.0, 0.0);"
"const ivec3 offset = ivec3(-1, 0, 1);"
"void main(void)"
"{"
"vec2 coord = gl_TexCoord[0].xy;"
"float s01 = textureOffset(heightmap, coord, offset.xy).x;"
"float s21 = textureOffset(heightmap, coord, offset.zy).x;"
"float s10 = textureOffset(heightmap, coord, offset.yx).x;"
"float s12 = textureOffset(heightmap, coord, offset.yz).x;"
"vec3 va = normalize(vec3(size.xy, s21 - s01));"
"vec3 vb = normalize(vec3(size.yx, s12 - s10));"
"vec2 dudv = cross(va, vb).rg;"
"gl_FragColor = texture2D(texture, coord + dudv * 0.2);"
"}";
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
int main()
{
sf::RenderWindow renderWindow(sf::VideoMode(800u, 600u), "");
renderWindow.setVerticalSyncEnabled(true);
sf::Clock frameClock, shaderClock;
sf::Shader sinEffect;
sinEffect.loadFromMemory(sinShader, sf::Shader::Fragment);
sf::RectangleShape rect(sf::Vector2f(600.f, 600.f));
sf::RenderTexture rt;
rt.create(600, 600);
sf::Shader dudvEffect;
dudvEffect.loadFromMemory(dudvShader, sf::Shader::Fragment);
dudvEffect.setParameter("heightmap", rt.getTexture());
sf::Texture texture;
texture.loadFromFile("assets/textures/crate.jpg");
texture.setRepeated(true);
sf::Sprite sprite(texture);
//-----------------------------------//
while(renderWindow.isOpen())
{
//poll input
sf::Event event;
while(renderWindow.pollEvent(event))
{
if (event.type == sf::Event::Closed)
renderWindow.close();
if(event.type == sf::Event::KeyReleased)
{
switch(event.key.code)
{
case sf::Keyboard::D:
break;
default: break;
}
}
}
//update shader
sinEffect.setParameter("time", shaderClock.getElapsedTime().asSeconds());
//draw
frameClock.restart();
rt.clear();
rt.draw(rect, &sinEffect);
rt.display();
renderWindow.clear();
//renderWindow.draw(sf::Sprite(rt.getTexture())); //draws height map
renderWindow.draw(sprite, &dudvEffect);
renderWindow.display();
renderWindow.setTitle(std::to_string(1.f / frameClock.getElapsedTime().asSeconds()));
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment