[SFML 2.X GLSL] Progress Bar
Ostatnio zmodyfikowano 2025-02-07 14:32
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 ... #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
#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
#include <SFML/Graphics.hpp> #include "Window.hpp" #include "ProgressBar.hpp"
int main() { ProgressBar * progress_bar = new ProgressBar(); float steps = 8.0f; 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; |
|
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: 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;
}
)";
|
|
« 1 » |