Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include <SFML/Graphics.hpp> #include <iostream> int main() { sf::RenderWindow window(sf::VideoMode(600, 600), "SFML works!"); window.setFramerateLimit(60); sf::RenderTexture buffers[3]; buffers[0].create(500, 500); buffers[1].create(500, 500); buffers[2].create(500, 500); sf::RenderTexture* firstBuffer = buffers; sf::RenderTexture* secondBuffer = &buffers[1]; sf::RenderTexture* finalBuffer = &buffers[2]; sf::Shader waterHeightmapShader; waterHeightmapShader.loadFromFile("waterHeightmapShader.glsl", sf::Shader::Fragment); sf::Sprite sprite; sprite.setPosition(50, 50); sprite.setTexture(finalBuffer->getTexture()); while (window.isOpen()) { waterHeightmapShader.setParameter("mousePosition", sf::Vector2f(-1, -1)); sf::Event event; while (window.pollEvent(event)) { if(event.type == sf::Event::Closed) window.close(); if(event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Escape) window.close(); // when the spacebar is pressed, add a new ripple at the mouse position if(event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Space) { sf::Vector2i mousePosition = sf::Mouse::getPosition(window); if(mousePosition.x > 50 && mousePosition.y > 50 && mousePosition.x < 600 - 50 && mousePosition.y < 600 - 50) { mousePosition.x -= 50; mousePosition.y -= 50; sf::Vector2f tester(mousePosition); tester.x /= 500.f; tester.y /= 500.f; tester.y = 1 - tester.y; std::cout << tester.x << " " << tester.y << std::endl; waterHeightmapShader.setParameter("mousePosition", tester); } } } waterHeightmapShader.setParameter("textureTwoFramesAgo", firstBuffer->getTexture()); waterHeightmapShader.setParameter("textureOneFrameAgo", secondBuffer->getTexture()); // create the heightmap finalBuffer->clear(sf::Color::Transparent); finalBuffer->draw(sf::Sprite(secondBuffer->getTexture()), &waterHeightmapShader); finalBuffer->display(); sprite.setTexture(finalBuffer->getTexture()); window.clear(); window.draw(sprite); window.display(); // swap the buffers around, first becomes second, second becomes third and third becomes first sf::RenderTexture* swapper = firstBuffer; firstBuffer = secondBuffer; secondBuffer = finalBuffer; finalBuffer = swapper; } return 0; } |
HLSL-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
// Scene buffer uniform sampler2D textureTwoFramesAgo; uniform sampler2D textureOneFrameAgo; uniform vec2 mousePosition; const float textureSize = 500.0; const float pixelSize = 1.0 / textureSize; void main() { // pixels position vec2 position = gl_TexCoord[0].st; vec4 finalColor = (texture2D(textureTwoFramesAgo, vec2(position.x - pixelSize, position.y)) + texture2D(textureTwoFramesAgo, vec2(position.x + pixelSize, position.y)) + texture2D(textureTwoFramesAgo, vec2(position.x, position.y + pixelSize)) + texture2D(textureTwoFramesAgo, vec2(position.x, position.y - pixelSize)) ) / 2.0 - texture2D(textureOneFrameAgo, position); // damping // finalColor *= 0.9; // add new ripples if(mousePosition.x > 0.0) if(distance(position, mousePosition) < pixelSize * 5.0) { finalColor = vec4(1.0, 1.0, 1.0, 1.0); } gl_FragColor = finalColor; } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Foaly« (17.01.2013, 16:53)
C-/C++-Quelltext |
|
1 2 3 4 5 |
CurrentFrame[x, y] = (( LastFrame[x+1, y] + LastFrame[x-1, y] + LastFrame[x, y+1] + LastFrame[x, y-1] ) / 2 ) - PreviousToLastFrame[x, y] |
HLSL-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
vec4 finalColor = (texture2D(textureOneFrameAgo, vec2(position.x - pixelSize, position.y)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x + pixelSize, position.y)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x, position.y + pixelSize)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x, position.y - pixelSize)) - 0.5 ) / 2.0 - texture2D(textureTwoFramesAgo, position) - 0.5; finalColor.rgb += 0.5; gl_FragColor = finalColor; |
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
HLSL-Quelltext |
|
1 2 3 4 5 |
vec4 finalColor = (texture2D(textureOneFrameAgo, vec2(position.x - pixelSize, position.y)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x + pixelSize, position.y)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x, position.y + pixelSize)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x, position.y - pixelSize)) - 0.5 ) / 2.0 - texture2D(textureTwoFramesAgo, position) - 0.5; |
HLSL-Quelltext |
|
1 2 3 4 5 |
vec4 finalColor = (texture2D(textureOneFrameAgo, vec2(position.x - pixelSize, position.y)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x + pixelSize, position.y)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x, position.y + pixelSize)) - 0.5 + texture2D(textureOneFrameAgo, vec2(position.x, position.y - pixelSize)) - 0.5 ) / 2.0 - (texture2D(textureTwoFramesAgo, position) - 0.5); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
#include <SFML/Graphics.hpp> #include <iostream> int main() { sf::RenderWindow window(sf::VideoMode(1000, 1000), "SFML works!"); window.setFramerateLimit(12); sf::RenderTexture buffers[3]; buffers[0].create(500, 500); buffers[1].create(500, 500); buffers[2].create(500, 500); sf::RenderTexture* firstBuffer = buffers; sf::RenderTexture* secondBuffer = &buffers[1]; sf::RenderTexture* finalBuffer = &buffers[2]; firstBuffer->clear(sf::Color(128, 128, 128)); secondBuffer->clear(sf::Color(128, 128, 128)); finalBuffer->clear(sf::Color(128, 128, 128)); sf::Shader waterHeightmapShader; waterHeightmapShader.loadFromFile("waterHeightmapShader.glsl", sf::Shader::Fragment); sf::Sprite spritefirst; spritefirst.setPosition(0, 0); spritefirst.setTexture(firstBuffer->getTexture()); sf::Sprite spritesecond; spritesecond.setPosition(500, 0); spritesecond.setTexture(secondBuffer->getTexture()); sf::Sprite spritefinal; spritefinal.setPosition(0, 500); spritefinal.setTexture(finalBuffer->getTexture()); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if(event.type == sf::Event::Closed) window.close(); if(event.type == sf::Event::KeyReleased && event.key.code == sf::Keyboard::Escape) window.close(); } waterHeightmapShader.setParameter("mousePosition", sf::Vector2f(-1.f, -1.f)); // if mouse button is pressed add new ripples if(sf::Mouse::isButtonPressed(sf::Mouse::Left)) { sf::Vector2i mousePosition = sf::Mouse::getPosition(window); if(mousePosition.x < 500 && mousePosition.y < 500) { sf::Vector2f mouse(mousePosition); mouse.x /= 500.f; mouse.y /= 500.f; mouse.y = 1 - mouse.y; std::cout << mouse.x << " " << mouse.y << std::endl; waterHeightmapShader.setParameter("mousePosition", mouse); } } waterHeightmapShader.setParameter("textureTwoFramesAgo", firstBuffer->getTexture()); waterHeightmapShader.setParameter("textureOneFrameAgo", secondBuffer->getTexture()); // create the heightmap secondBuffer->display(); finalBuffer->clear(sf::Color(128, 128, 128)); finalBuffer->draw(sf::Sprite(secondBuffer->getTexture()), &waterHeightmapShader); finalBuffer->display(); spritefirst.setTexture(firstBuffer->getTexture()); spritesecond.setTexture(secondBuffer->getTexture()); spritefinal.setTexture(finalBuffer->getTexture()); window.clear(); window.draw(spritefirst); window.draw(spritesecond); window.draw(spritefinal); window.display(); // swap the buffers around, first becomes second, second becomes third and third becomes first sf::RenderTexture* swapper = firstBuffer; firstBuffer = secondBuffer; secondBuffer = finalBuffer; finalBuffer = swapper; } return 0; } |
HLSL-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
uniform sampler2D textureTwoFramesAgo; uniform sampler2D textureOneFrameAgo; uniform vec2 mousePosition; const float textureSize = 500.0; const float pixelSize = 1.0 / textureSize; void main() { // pixels position vec2 position = gl_TexCoord[0].st; vec4 finalColor = ((texture2D(textureOneFrameAgo, vec2(position.x - pixelSize, position.y)) + texture2D(textureOneFrameAgo, vec2(position.x + pixelSize, position.y)) + texture2D(textureOneFrameAgo, vec2(position.x, position.y + pixelSize)) + texture2D(textureOneFrameAgo, vec2(position.x, position.y - pixelSize)) - 2.0) / 2) - (texture2D(textureTwoFramesAgo, position) - 0.5); // damping // finalColor.rgb *=0.9 // damping // finalColor.rgb *= 1.9; // <--- Verstärkung (wenn man das hier unkommentiert sieht man die Wellen besser) finalColor.rgb += 0.5; // add new ripples if(mousePosition.x > 0.0) { if(distance(position, mousePosition) < pixelSize * 5.0) { finalColor = vec4(0.9, 0.9, 0.9, 1.0); } } gl_FragColor = finalColor; } |
Werbeanzeige