tBane Temat założony przez niniejszego użytkownika |
[SFML 2.X] Zarządzanie Kilkoma Shaderami w jednym sf::Drawable / sf::Transformable » 2024-09-25 23:53:01 Witam. Mam pytanie. Generuje wodę dziedzicząc po sf::Drawable oraz sf::Transformable. Wtedy to definiuje kształt wody korzystając sf::VertexArray następnie taką wodę renderuję poprzez użycie shadera window->draw(waters, &shader). Chciałbym teraz dodać kilka rodzajów wody np. enum class waterType { lake, ocean, swamp }. Wtedy miałbym 3 shadery i musiałbnym wybierać, który renderuje. Jak w najwygodniejszy sposób zarządzać takimi shaderami? Wiem, że mogę zrobić 3xwodę tzn water lake, water ocean, water swamp ale to chyba niezbyt wygodne w zarządzaniu i edytowaniu. Jak Wy byście to zrobili ? class Water : public sf::Drawable , public sf::Transformable { public: int width, height; sf::Vector2i coords; sf::VertexArray vertexes; Texture * noiseTexture; std::vector < std::vector < bool > > waters; Mój obecny pomysł na rozwiązanie problemu: Water lake; Water ocean; Water Swamp;
window.draw( lake, & lakeShader ); window.draw( ocean, & oceanShader ); window.draw( swamp, & swampShader );
|
|
pekfos |
» 2024-09-26 17:29:01 następnie taką wodę renderuję poprzez użycie shadera window->draw(waters, &shader). Dlaczego tak? Wybór i użycie shadera powinno być szczegółem implementacyjnym klasy Water. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-26 22:36:39 O to chodziło ? Ale to i tak nie rozwiązuje problemu kilku shaderów virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const { states.transform *= getTransform(); states.texture = getTexture( "noise" )->texture; states.shader = getShader( "shaders/water" )->shader; target.draw( vertexes, states ); }
|
|
pekfos |
» 2024-09-26 23:39:08 To chyba nie rozumiem problemu kilku shaderów. Miałeś mieć enuma waterType, zapewne pole tego typu będzie w klasie Water, więc w Water::draw() wybierz shader na podstawie wartości enuma. Nie o to chodziło? |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-26 23:48:32 nie, nie o to. Spróbuję wyrazić się precyzyjniej. Chciałbym to: std::vector < std::vector < bool > > waters;
Przerobić na : enum class waterType { lake, ocean, swamp }; std::vector < std::vector < waterType > > waterTiles;
I w zależności od wartości waterTiles[x][y] chciałbym używać konkretnego shadera |
|
pekfos |
» 2024-09-27 19:36:53 Na podstawie enuma dodawaj geometrię do jednego z 3 VertexArray i każdy renderuj z odpowiednim shaderem. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-09-27 19:38:04 mhm.. no właśnie tego próbowałem uniknąć. Ale jak nie da się inaczej to tak zrobię. Dzięki za pomoc :-) |
|
pekfos |
» 2024-09-27 19:46:05 Możesz podać jeden shader, tak samo jak jedną teksturę. Możesz mieć jeden shader który ma różne zachowania zależne od parametru, w tym wypadku pewnie ma sens tylko atrybut wierzchołka. SFML nie pozwala na dodawanie własnych atrybutów, ale możesz użyć jednego z istniejących, np koloru. Kolor wierzchołka jest domyślnie domiksowywany do kolorów z tekstury, ale to jest zadanie fragment shadera. Pewnie tego nie potrzebujesz, więc możesz użyć koloru wierzchołka by określić jaki shader ma być wykonany. W vertex shaderze masz dostęp do atrybutów wierzchołków i możesz przekazać wartości do fragment shadera przez zmienną varying. Wartość tej zmiennej będzie interpolowana, więc ustaw ją tak samo dla wszystkich wierzchołków by to nie przeszkadzało w sterowaniu. |
|
« 1 » 2 |