tBane Temat założony przez niniejszego użytkownika |
[SFML 2.X] Przypisanie przezroczystego prostokąta teksturze » 2024-11-08 17:34:12 Witam. Jak usunąć fragment tekstury sf::RenderTexture? To znaczy mam przeźroczysty prostokąt, który chciałbym umieścić na teksturze i żeby przypisało te przeźroczyste piksele? |
|
DejaVu |
» 2024-11-09 09:55:02 Jeżeli chcesz mieć teksturę z 'dziurą' w środku, to musisz przygotować sobie sf::Image z 'dziurą' w środku (z pikselami przezroczystymi), a następnie załadować teksturę do sf::Texture. Innymi słowy: jeżeli chcesz zmieniać wygląd tekstury to powinieneś 'zmodyfikować' wygląd w sf::Image (która znajduje się w pamięci RAM), a następnie go załadować do sf::Texture. Jak masz już załadowaną teksturę do sf::Texture (czyli w praktyce do pamięci karty graficznej), to później pozostają Ci tylko shadery do modyfikowania wyglądu.
Musisz sobie uświadomić, że: - sf::Image - obrazek trzymany jest w pamięci RAM, więc można go łatwo modyfikować i obrabiać, bo do pamięci RAM masz dostęp przez CPU - sf::Texture - obrazek jest trzymany w pamięci karty graficznej, a dostęp do niego masz przez procesor karty graficznej (GPU)
sf::Texture służy poniekąd do transferu danych z RAM do GPU-RAM i na odwrót. |
|
pekfos |
» 2024-11-09 12:57:57 |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-09 13:06:18 Ok. Dzięki! :-) |
|
pekfos |
» 2024-11-09 13:10:23 Pierwsza opcja jest trywialna, to dla demonstracji druga: #include <SFML/Graphics.hpp>
int main() { sf::RenderWindow okno( sf::VideoMode( 200, 200 ), "Kurs SFML 2.0 - http://cpp0x.pl" ); sf::RenderTexture rt; rt.create( 200, 200 ); rt.clear( sf::Color::Transparent ); { sf::CircleShape cs( 80 ); cs.setOrigin( cs.getRadius() * sf::Vector2f( 1, 1 ) ); cs.setFillColor( sf::Color::Red ); cs.setPosition( 100, 100 ); rt.draw( cs ); cs.setRadius( 50 ); cs.setOrigin( cs.getRadius() * sf::Vector2f( 1, 1 ) ); cs.setFillColor( sf::Color::Transparent ); sf::RenderStates rs; rs.blendMode = sf::BlendNone; rt.draw( cs, rs ); rt.display(); } while( okno.isOpen() ) { sf::Event event; while( okno.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) okno.close(); } okno.clear( sf::Color::Cyan ); sf::Sprite spr; spr.setTexture( rt.getTexture() ); okno.draw( spr ); okno.display(); } } |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-09 19:35:55 Spróbowałem tak zrobić i nie działa :-/ A jak dopiszę rtex.display() to psuje mi teksture i .. i tak nie rysuje transparentego prostokąta if( _door != nullptr ) { sf::RectangleShape door( sf::Vector2f( _door->sprite.getTexture()->getSize() ) ); door.setFillColor( sf::Color::Transparent ); door.setPosition( float( size.x ) / 2.0f * 16.0f - door.getSize().x / 2.0f + tile_width / 2.0f, 0.0f ); rtex.draw( door, sf::RenderStates( sf::BlendNone ) ); }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-09 19:46:08 |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-09 20:31:53 Dobra już mam. Oto kod: if( _door != nullptr ) { sf::RectangleShape door( sf::Vector2f( _door->sprite.getTexture()->getSize() ) ); for( short y = 0; y < door.getSize().y - 1; y++ ) for( short x = 0; x < door.getSize().x; x++ ) { sf::Vector2i pos; pos.x = float( size.x ) / 2.0f * 16.0f - door.getSize().x / 2.0f + tile_width / 2.0f + x; pos.y = rtex.getSize().y - 1 - y; house_image.setPixel( pos.x, pos.y, sf::Color( 0, 0, 0, 0 ) ); } }
|
|
« 1 » |