Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.X GLSL] Progress Bar

Ostatnio zmodyfikowano 2025-02-07 14:32
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML 2.X GLSL] Progress Bar
» 2025-02-07 08:19:08
Witam. Próbuję napisać shadery Paska Ładowania. Potrzebuję, wyświetlać do wartości progress czerwony pasek ...


C/C++
#ifndef Window_hpp
#define Window_hpp

float screenWidth = 1280;
float screenHeight = 720;

sf::RenderWindow * window = new sf::RenderWindow( sf::VideoMode( int( screenWidth ), int( screenHeight ) ), "" );

#endif

C/C++
#ifndef ProgressBar_hpp
#define ProgressBar_hpp

std::string vertex_shader = R"( attribute vec2 position; attribute vec2 texcoord; void main() { gl_Position = vec4(position, 0.0, 1.0); } )";

std::string fragment_shader = R"( uniform sampler2D texture; uniform float progress; void main() { vec4 tex_color = texture2D(texture, gl_TexCoord[0].xy); if (gl_TexCoord[0].x < progress) { tex_color = vec4(1.0, 0.0, 0.0, 1.0); // Zmiana koloru na czerwony } gl_FragColor = tex_color; } )";


class ProgressBar {
public:
   
   
sf::Texture bar_texture;
   
sf::Shader shader;
   
sf::Sprite bar;
   
sf::Vector2f position;
   
   
ProgressBar() {
       
bar_texture.loadFromFile( "assets/GUI/progress_bar.png" );
       
       
shader.loadFromMemory( vertex_shader, fragment_shader );
       
       
position.x = float( window->getSize().x ) / 2.0f;
       
position.y = float( window->getSize().y ) * 4.0f / 5.0f;
       
       
bar.setTexture( bar_texture );
       
bar.setOrigin( bar_texture.getSize().x / 2, bar_texture.getSize().y / 2 );
       
bar.setPosition( position );
   
}
   
   
~ProgressBar() { }
   
   
void draw( float progress ) {
       
       
shader.setUniform( "texture", bar_texture );
       
shader.setUniform( "progress", progress );
       
       
window->clear();
       
window->draw( bar, & shader );
       
window->display();
   
}
}
;

#endif

C/C++
#include <SFML/Graphics.hpp>
#include "Window.hpp"
#include "ProgressBar.hpp"

int main()
{
   
ProgressBar * progress_bar = new ProgressBar();
   
   
float steps = 8.0f;
   
   
   
// LOADS
   
progress_bar->draw( 0.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
progress_bar->draw( 1.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
progress_bar->draw( 2.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
progress_bar->draw( 3.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
progress_bar->draw( 4.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
progress_bar->draw( 5.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
progress_bar->draw( 6.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
progress_bar->draw( 7.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
progress_bar->draw( 8.0f / steps );
   
sf::sleep( sf::seconds( 1 ) );
   
   
return 0;
   
P-182114
tBane
Temat założony przez niniejszego użytkownika
» 2025-02-07 14:32:18
Należy pozbyć się vertex shadera i napisać fragment shader w ten oto sposób:

C/C++
std::string fragment_shader = R"( uniform sampler2D texture; uniform float progress; void main() { vec4 tex_color = texture2D(texture, gl_TexCoord[0].xy); if (gl_TexCoord[0].x < progress) { tex_color = vec4(1.0, 0.0, 0.0, 1.0); // Zmiana koloru na czerwony } gl_FragColor = tex_color; } )";

P-182116
« 1 »
  Strona 1 z 1