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

[SFML 2.X] Zarządzanie Kilkoma Shaderami w jednym sf::Drawable / sf::Transformable

Ostatnio zmodyfikowano 2024-09-30 17:24
Autor Wiadomość
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 ?

C/C++
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:
C/C++
Water lake;
Water ocean;
Water Swamp;

window.draw( lake, & lakeShader );
window.draw( ocean, & oceanShader );
window.draw( swamp, & swampShader );
P-181637
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.
P-181638
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

C/C++
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 );
}

C/C++
window->draw( waters );
P-181639
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?
P-181640
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:
C/C++
std::vector < std::vector < bool > > waters;

Przerobić na :
C/C++
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
P-181641
pekfos
» 2024-09-27 19:36:53
Na podstawie enuma dodawaj geometrię do jednego z 3 VertexArray i każdy renderuj z odpowiednim shaderem.
P-181643
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 :-)
P-181644
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.
P-181646
« 1 » 2
  Strona 1 z 2 Następna strona