Last active
July 26, 2017 15:53
-
-
Save fallahn/8316951 to your computer and use it in GitHub Desktop.
2D water effect with GLSL and SFML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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